diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 73e14d7..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/MVMCore/MVMCore.xcodeproj/project.pbxproj b/MVMCore/MVMCore.xcodeproj/project.pbxproj index c90029e..fc302b5 100644 --- a/MVMCore/MVMCore.xcodeproj/project.pbxproj +++ b/MVMCore/MVMCore.xcodeproj/project.pbxproj @@ -120,7 +120,6 @@ AFBB96B81FBA3CEC0008D868 /* MVMCoreActionDelegateProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBB96B51FBA3CEC0008D868 /* MVMCoreActionDelegateProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; AFBB96B91FBA3CEC0008D868 /* MVMCoreActionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBB96B61FBA3CEC0008D868 /* MVMCoreActionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; AFBB96BA1FBA3CEC0008D868 /* MVMCoreActionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = AFBB96B71FBA3CEC0008D868 /* MVMCoreActionHandler.m */; }; - AFBB96EB1FBA4A260008D868 /* canned.json in Resources */ = {isa = PBXBuildFile; fileRef = AFBB96E81FBA4A260008D868 /* canned.json */; }; AFBB96EC1FBA4A260008D868 /* MFHardCodedServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBB96E91FBA4A260008D868 /* MFHardCodedServerResponse.h */; }; AFBB96ED1FBA4A260008D868 /* MFHardCodedServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = AFBB96EA1FBA4A260008D868 /* MFHardCodedServerResponse.m */; }; AFC5FA161FFC2E2A00C244CF /* MVMCoreGlobalTopAlertDelegateProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = AFC5FA141FFC2E2A00C244CF /* MVMCoreGlobalTopAlertDelegateProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -252,7 +251,6 @@ AFBB96B61FBA3CEC0008D868 /* MVMCoreActionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreActionHandler.h; sourceTree = ""; }; AFBB96B71FBA3CEC0008D868 /* MVMCoreActionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreActionHandler.m; sourceTree = ""; }; AFBB96D21FBA44420008D868 /* VZWAuthentication.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VZWAuthentication.framework; path = ../../SharedFrameworks/VZWAuthentication.framework; sourceTree = ""; }; - AFBB96E81FBA4A260008D868 /* canned.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = canned.json; sourceTree = ""; }; AFBB96E91FBA4A260008D868 /* MFHardCodedServerResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFHardCodedServerResponse.h; sourceTree = ""; }; AFBB96EA1FBA4A260008D868 /* MFHardCodedServerResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFHardCodedServerResponse.m; sourceTree = ""; }; AFC5FA141FFC2E2A00C244CF /* MVMCoreGlobalTopAlertDelegateProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreGlobalTopAlertDelegateProtocol.h; sourceTree = ""; }; @@ -580,7 +578,6 @@ AFBB96E71FBA4A260008D868 /* HardCodedServerResponse */ = { isa = PBXGroup; children = ( - AFBB96E81FBA4A260008D868 /* canned.json */, AFBB96E91FBA4A260008D868 /* MFHardCodedServerResponse.h */, AFBB96EA1FBA4A260008D868 /* MFHardCodedServerResponse.m */, ); @@ -741,7 +738,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - AFBB96EB1FBA4A260008D868 /* canned.json in Resources */, AF26DDAE1FCE6A37004E8F65 /* Localizable.strings in Resources */, AFBB96561FBA3A570008D868 /* freebee.json in Resources */, AFBB96591FBA3A570008D868 /* freebeelaunchApp.json in Resources */, @@ -971,6 +967,7 @@ "$(PROJECT_DIR)/MVMCore/EmbeddedLibaries/AdobeMobileLibrary", "$(PROJECT_DIR)/MVMCore/EmbeddedLibraries/VZAnalytics", ); + ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCore; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m index c407018..a3b244e 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadHandler.m @@ -165,7 +165,7 @@ // Sets up the Initial parameters. if (requestParameters.addInitialRequestParameters) { - NSDictionary *initialParameters = [[MVMCoreSessionObject sharedGlobal] getInitialParameters]; + NSDictionary *initialParameters = [[MVMCoreSessionObject sharedGlobal] getInitialParametersExcludingSections:requestParameters.excludedInitialParameters]; if (initialParameters) { [parameters setObject:initialParameters forKey:@"InitialParams"]; } @@ -310,8 +310,15 @@ } return nil; } + NSURLSession *session = [MVMCoreSessionObject sharedGlobal].session; - + if (!session) { +#warning Hotfix for when session is nil. We should switch to logging these errors once we fix how session handler misses canceling certain calls because they happen at the same time. + error = [[MVMCoreErrorObject alloc] initWithTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] messageToLog:nil code:ErrorCodeDefault domain:ErrorDomainNative location:locationForError]; + error.logError = NO; + requestFinished(nil,error); + } + if ([[MFFreebeeHandler sharedHandler] isFreeBeeEnabled] && [[MFFreebeeHandler sharedHandler] isValidCampaign]) { BOOL isAllowedPage = [[MFFreebeeHandler sharedHandler] isAllowedPage:requestParameters.pageType]; diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadObject.h b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadObject.h index dfe6705..014e4ba 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadObject.h +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadObject.h @@ -56,4 +56,7 @@ - (nullable instancetype)initWithPageJSON:(nullable NSDictionary *)pageJSON errorObject:(nullable MVMCoreErrorObject *)errorObject; +// Returns whether the load will extend the app session timer based on the response provided by the server. +- (BOOL)extendsAppSession; + @end diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadObject.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadObject.m index 3064012..388f911 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadObject.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadObject.m @@ -9,6 +9,7 @@ #import "MVMCoreLoadObject.h" #import "MVMCoreErrorObject.h" #import "MVMCoreJSONConstants.h" +#import "NSDictionary+MFConvenience.h" @implementation MVMCoreLoadObject @@ -54,4 +55,9 @@ return self; } +- (BOOL)extendsAppSession { + NSNumber *extendSessionFlag = [self.responseInfoMap objectForKey:@"appSessionExtended" ofType:[NSNumber class]]; + return !extendSessionFlag || [extendSessionFlag boolValue]; // Default to YES if the key does not exist. +} + @end diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m index 7c919b1..b01a990 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation.m @@ -163,7 +163,7 @@ if ([loadObject.operation checkAndHandleForCancellation]) { return; } - + if (loadObject.pageDataFromCache || loadObject.pageType) { // Can continue loading with the page. @@ -283,10 +283,8 @@ if ([jsonObject isKindOfClass:[NSDictionary class]]) { - // Update the session timer on a good response. - [[MVMCoreSessionTimeHandler sharedSessionHandler] startSessionTimer]; - completionHandler(jsonObject); + } else { // Error json not correct format. @@ -365,6 +363,11 @@ // Sets the response info map loadObject.responseInfoMap = [jsonDictionary dict:KeyResponseInfo]; + // Update the session timer on a good response. + if (loadObject.extendsAppSession) { + [[MVMCoreSessionTimeHandler sharedSessionHandler] startSessionTimer]; + } + // Dismiss any top alerts that server wants us to dismiss [[MVMCoreAlertHandler sharedAlertHandler] hidePersistentTopAlertViewOfType:[loadObject.responseInfoMap string:@"disableType"]]; diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.h b/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.h index 315c521..b53ae9d 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.h +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.h @@ -63,6 +63,9 @@ typedef NS_ENUM(NSInteger, MFLoadStyle) { // A flag for if we should be adding the initial request parameters. @property (assign, nonatomic) BOOL addInitialRequestParameters; +// A list of initial parameter sections to blacklist / skip. +@property (nullable, strong, nonatomic) NSSet *excludedInitialParameters; + // A flag for if we should always show alerts, even during a background load. @property (assign) BOOL allowAlertsIfBackgroundRequest; @@ -88,7 +91,7 @@ typedef NS_ENUM(NSInteger, MFLoadStyle) { @property (nonatomic) BOOL openSupportPanel; // A list of page types that this operation should NOT be loaded in parallel with. -@property (nonatomic) NSArray* _Nullable successivePageTypes; +@property (nullable, strong, nonatomic) NSArray * successivePageTypes; // Creates an object with the given page type and extra parameters. Adds the extra parameters to the standard request parameters. Will add any modules needed by the page type by default. - (nullable instancetype)initWithPageType:(nonnull NSString *)pageType extraParameters:(nullable NSDictionary *)extraParameters; diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.m b/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.m index 70bb74c..8524bf3 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.m +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreRequestParameters.m @@ -125,6 +125,7 @@ copyObject.shouldNotGoToServerOnCacheFail = self.shouldNotGoToServerOnCacheFail; copyObject.neverLoadFromCache = self.neverLoadFromCache; copyObject.addInitialRequestParameters = self.addInitialRequestParameters; + copyObject.excludedInitialParameters = self.excludedInitialParameters; copyObject.tabWasPressed = self.tabWasPressed; copyObject.navigationController = self.navigationController; copyObject.allowAlertsIfBackgroundRequest = self.allowAlertsIfBackgroundRequest; diff --git a/MVMCore/MVMCore/Session/MVMCoreSessionObject.h b/MVMCore/MVMCore/Session/MVMCoreSessionObject.h index 04f64ad..c2a85e6 100644 --- a/MVMCore/MVMCore/Session/MVMCoreSessionObject.h +++ b/MVMCore/MVMCore/Session/MVMCoreSessionObject.h @@ -28,6 +28,8 @@ // Gets inital parameters for request parameters. - (nullable NSDictionary *)getInitialParameters; +// Gets inital parameters for request parameters excluding any items given a list of key names. +- (nullable NSDictionary *)getInitialParametersExcludingSections:(nullable NSSet *)excludeSections; // Restarts the application session state. Can clear variables and pass a page type if needed. - (void)restartSessionWithPageType:(nullable NSString *)pageType parameters:(nullable NSDictionary *)parameters clearAllVariables:(BOOL)clearAllVariables; diff --git a/MVMCore/MVMCore/Session/MVMCoreSessionObject.m b/MVMCore/MVMCore/Session/MVMCoreSessionObject.m index 343afbb..b49132d 100644 --- a/MVMCore/MVMCore/Session/MVMCoreSessionObject.m +++ b/MVMCore/MVMCore/Session/MVMCoreSessionObject.m @@ -16,6 +16,10 @@ } - (nullable NSDictionary *)getInitialParameters { + return [self getInitialParametersExcludingSections:nil]; +} + +- (nullable NSDictionary *)getInitialParametersExcludingSections:(nullable NSSet *)excludeSections { return nil; } diff --git a/MVMCore/MVMCore/Utility/HardCodedServerResponse/MFHardCodedServerResponse.m b/MVMCore/MVMCore/Utility/HardCodedServerResponse/MFHardCodedServerResponse.m index d71c797..4ed21be 100644 --- a/MVMCore/MVMCore/Utility/HardCodedServerResponse/MFHardCodedServerResponse.m +++ b/MVMCore/MVMCore/Utility/HardCodedServerResponse/MFHardCodedServerResponse.m @@ -9,6 +9,7 @@ #import "MFHardCodedServerResponse.h" #import "MVMCoreRequestParameters.h" #import "NSDictionary+MFConvenience.h" +#import "MVMCoreLoggingHandler.h" #if ENABLE_HARD_CODED_RESPONSE @@ -48,7 +49,7 @@ if(error) { MVMCoreLog(@"Error creating JSON!"); } else { - //DLog(@"Canned json responses:%@", jsonObj); + //MVMCoreLog(@"Loaded canned json responses:\n%@", jsonObj); } } } diff --git a/MVMCore/MVMCore/Utility/HardCodedServerResponse/canned.json b/MVMCore/MVMCore/Utility/HardCodedServerResponse/canned.json deleted file mode 100644 index 781fb51..0000000 --- a/MVMCore/MVMCore/Utility/HardCodedServerResponse/canned.json +++ /dev/null @@ -1,678 +0,0 @@ -{ - "selectFeedbackSource": { - "ResponseInfo": { - "locale": "EN", - "server": "twswcmvmzad03.tdc.vzwcorp.com-srv01_nmobilefirst01", - "userMessage": "0", - "code": "00000", - "message": "0", - "mdn": "7323798012", - "buildNumber": "9633", - "type": "Success", - "requestId": "990372c1-19de-44b1-935f-6cedfbe36d41" - }, - "Page": { - "pageType": "exploreZoneRtl", - "parentPageType": "visitUsRtl", - "tab": [ - { - "actionType": "openPage", - "pageType": "exploreZoneRtl", - "extraParameters": { - "zoneId": "90", - "zoneName": "GetFitZone" - }, - "itemName": "Get Fit", - "title": "Get Fit", - "appContext": "mobileFirstSS", - "modules": [ - "GetFitZone" - ] - }, - { - "actionType": "openPage", - "pageType": "exploreZoneRtl", - "extraParameters": { - "zoneId": "91", - "zoneName": "AmplifyItZone" - }, - "itemName": "Amplify It", - "title": "Amplify It", - "appContext": "mobileFirstSS", - "modules": [ - "AmplifyItZone" - ] - }, - { - "actionType": "openPage", - "pageType": "exploreZoneRtl", - "extraParameters": { - "zoneId": "93", - "zoneName": "HomeServicesZone" - }, - "itemName": "Home Service", - "title": "Home Service", - "appContext": "mobileFirstSS", - "modules": [ - "HomeServicesZone" - ] - } - ], - "beaconids": [ - { - "tabIndex": 0, - "minor": 23233, - "zoneId": 90, - "major": 7203, - "locationCode": "W078801", - "header": null - }, - { - "tabIndex": 1, - "minor": 23424, - "zoneId": 91, - "major": 7203, - "locationCode": "W078801", - "header": null - }, - { - "tabIndex": 2, - "minor": 24016, - "zoneId": 93, - "major": 7203, - "locationCode": "W078801", - "header": null - } - ], - "title": "Title", - "message": "Please enable your Bluetooth to detect the zone you are exploring", - "currentTabIndex": 1, - "ButtonMap": { - "AsyncCallButton": { - "actionType": "openPage", - "pageType": "exploreZoneModAsyncRtl", - "tryToReplaceFirst": false, - "title": "Explore Zone Async Call", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - } - }, - "screenHeading": "Explore Products" - }, - "ModuleMap": { - "AmplifyItZone": { - "mappoint": "AmplifyItZone", - "zoneId": "91", - "name": "Amplify It", - "ResponseInfo": { - "locale": "EN", - "code": "00000", - "message": "0", - "userMessage": "0", - "type": "Success" - }, - "skuList": [ - [ - { - "deviceTitle": "Flip 2", - "stockInWarehouse": false, - "colorCode": "#003399", - "colorName": "Blue", - "isDevice": false, - "discountFlag": false, - "imageUrl": "https://mobile-edev.vzw.com/dev01/geofencing/instore/images/smart/s7/is/image/VerizonWireless/jbl-flip-2-blue-FLIPIIBLUAM-imageset?$acc-lg$", - "preSelected": false, - "qty": 349991, - "skuId": "FLIPIIBLUAM", - "ButtonMap": { - "PrimaryButton": { - "actionType": "openPage", - "pageType": "addToSharedCartRtl", - "extraParameters": { - "cmd": "add", - "cart": [ - { - "sku": "FLIPIIBLUAM", - "qty": 1 - } - ] - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Add to cart", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "MoreColors": { - "actionType": "openPage", - "pageType": "exploreZoneMoreClrsRtl", - "extraParameters": { - "sku": "FLIPIIBLUAM" - }, - "tryToReplaceFirst": false, - "title": "More colors", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "SecondaryButton": { - "actionType": "openPage", - "pageType": "getPDPBySKURtl", - "extraParameters": { - "sku": "FLIPIIBLUAM" - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Learn more", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - } - }, - "inStorePurchase": false, - "fallBackImageUrl": "ICON_DFLT_ACCESSORY_IMG", - "accessoryId": "acc2040005", - "inventoryMsg": "In stock, take it with you today.", - "priceMap": { - "netPrice": { - "price": "79.98" - }, - "discountPrice": { - "price": "0" - }, - "originalPrice": { - "price": "79.98" - } - }, - "device": false, - "sorId": "sku870003", - "stockInStore": true - }, - { - "deviceTitle": "Flip 2", - "stockInWarehouse": false, - "colorCode": "#000000", - "colorName": "Black", - "isDevice": false, - "discountFlag": false, - "imageUrl": "https://mobile-edev.vzw.com/dev01/geofencing/instore/images/smart/s7/is/image/VerizonWireless/jbl-flip-2-black-FLIPIIBLKAM-imageset?$acc-lg$", - "preSelected": true, - "qty": 349880, - "skuId": "FLIPIIBLKAM", - "ButtonMap": { - "PrimaryButton": { - "actionType": "openPage", - "pageType": "addToSharedCartRtl", - "extraParameters": { - "cmd": "add", - "cart": [ - { - "sku": "FLIPIIBLKAM", - "qty": 1 - } - ] - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Add to cart", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "MoreColors": { - "actionType": "openPage", - "pageType": "exploreZoneMoreClrsRtl", - "extraParameters": { - "sku": "FLIPIIBLKAM" - }, - "tryToReplaceFirst": false, - "title": "More colors", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "SecondaryButton": { - "actionType": "openPage", - "pageType": "getPDPBySKURtl", - "extraParameters": { - "sku": "FLIPIIBLKAM" - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Learn more", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - } - }, - "inStorePurchase": false, - "fallBackImageUrl": "ICON_DFLT_ACCESSORY_IMG", - "accessoryId": "acc2040005", - "inventoryMsg": "In stock, take it with you today.", - "priceMap": { - "netPrice": { - "price": "69.98" - }, - "discountPrice": { - "price": "0" - }, - "originalPrice": { - "price": "69.98" - } - }, - "device": false, - "sorId": "sku870008", - "stockInStore": true - }, - { - "deviceTitle": "Flip 2", - "stockInWarehouse": false, - "colorCode": "#ff0000", - "colorName": "Red", - "isDevice": false, - "discountFlag": false, - "imageUrl": "https://mobile-edev.vzw.com/dev01/geofencing/instore/images/smart/s7/is/image/VerizonWireless/jbl-flip-2-red-FLIPIIREDAM-imageset?$acc-lg$", - "preSelected": false, - "qty": 349989, - "skuId": "FLIPIIREDAM", - "ButtonMap": { - "PrimaryButton": { - "actionType": "openPage", - "pageType": "addToSharedCartRtl", - "extraParameters": { - "cmd": "add", - "cart": [ - { - "sku": "FLIPIIREDAM", - "qty": 1 - } - ] - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Add to cart", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "MoreColors": { - "actionType": "openPage", - "pageType": "exploreZoneMoreClrsRtl", - "extraParameters": { - "sku": "FLIPIIREDAM" - }, - "tryToReplaceFirst": false, - "title": "More colors", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "SecondaryButton": { - "actionType": "openPage", - "pageType": "getPDPBySKURtl", - "extraParameters": { - "sku": "FLIPIIREDAM" - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Learn more", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - } - }, - "inStorePurchase": false, - "fallBackImageUrl": "ICON_DFLT_ACCESSORY_IMG", - "accessoryId": "acc2040005", - "inventoryMsg": "In stock, take it with you today.", - "priceMap": { - "netPrice": { - "price": "79.98" - }, - "discountPrice": { - "price": "0" - }, - "originalPrice": { - "price": "79.98" - } - }, - "device": false, - "sorId": "sku870005", - "stockInStore": true - }, - { - "deviceTitle": "Flip 2", - "stockInWarehouse": false, - "colorCode": "#FFFF00", - "colorName": "Yellow", - "isDevice": false, - "discountFlag": false, - "imageUrl": "https://mobile-edev.vzw.com/dev01/geofencing/instore/images/smart/s7/is/image/VerizonWireless/jbl-flip-2-yellow-FLIPIIYELAM-imageset?$acc-lg$", - "preSelected": false, - "qty": 350000, - "skuId": "FLIPIIYELAM", - "ButtonMap": { - "PrimaryButton": { - "actionType": "openPage", - "pageType": "addToSharedCartRtl", - "extraParameters": { - "cmd": "add", - "cart": [ - { - "sku": "FLIPIIYELAM", - "qty": 1 - } - ] - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Add to cart", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "MoreColors": { - "actionType": "openPage", - "pageType": "exploreZoneMoreClrsRtl", - "extraParameters": { - "sku": "FLIPIIYELAM" - }, - "tryToReplaceFirst": false, - "title": "More colors", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "SecondaryButton": { - "actionType": "openPage", - "pageType": "getPDPBySKURtl", - "extraParameters": { - "sku": "FLIPIIYELAM" - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Learn more", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - } - }, - "inStorePurchase": false, - "fallBackImageUrl": "ICON_DFLT_ACCESSORY_IMG", - "accessoryId": "acc2040005", - "inventoryMsg": "In stock, take it with you today.", - "priceMap": { - "netPrice": { - "price": "79.98" - }, - "discountPrice": { - "price": "0" - }, - "originalPrice": { - "price": "79.98" - } - }, - "device": false, - "sorId": "sku870006", - "stockInStore": true - }, - { - "deviceTitle": "Flip 2", - "stockInWarehouse": false, - "colorCode": "#FFFFFF", - "colorName": "White", - "isDevice": false, - "discountFlag": false, - "imageUrl": "https://mobile-edev.vzw.com/dev01/geofencing/instore/images/smart/s7/is/image/VerizonWireless/jbl-flip-2-white-FLIPIIWHTAM-imageset?$acc-lg$", - "preSelected": false, - "qty": 349999, - "skuId": "FLIPIIWHTAM", - "ButtonMap": { - "PrimaryButton": { - "actionType": "openPage", - "pageType": "addToSharedCartRtl", - "extraParameters": { - "cmd": "add", - "cart": [ - { - "sku": "FLIPIIWHTAM", - "qty": 1 - } - ] - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Add to cart", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "MoreColors": { - "actionType": "openPage", - "pageType": "exploreZoneMoreClrsRtl", - "extraParameters": { - "sku": "FLIPIIWHTAM" - }, - "tryToReplaceFirst": false, - "title": "More colors", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "SecondaryButton": { - "actionType": "openPage", - "pageType": "getPDPBySKURtl", - "extraParameters": { - "sku": "FLIPIIWHTAM" - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Learn more", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - } - }, - "inStorePurchase": false, - "fallBackImageUrl": "ICON_DFLT_ACCESSORY_IMG", - "accessoryId": "acc2040005", - "inventoryMsg": "In stock, take it with you today.", - "priceMap": { - "netPrice": { - "price": "79.98" - }, - "discountPrice": { - "price": "0" - }, - "originalPrice": { - "price": "79.98" - } - }, - "device": false, - "sorId": "sku870007", - "stockInStore": true - } - ], - [ - { - "deviceTitle": "QuietComfort 25 Acoustic Noise Cancelling headphones - Apple devices", - "stockInWarehouse": false, - "colorCode": "#FFFFFF", - "colorName": "White", - "isDevice": false, - "discountFlag": false, - "imageUrl": "https://mobile-edev.vzw.com/dev01/geofencing/instore/images/smart/s7/is/image/VerizonWireless/bose-quietcomfort-25-acoustic-noise-cancelling-headphones-white-iset-715053-0020?$acc-lg$", - "preSelected": false, - "qty": 99986, - "skuId": "715053-0020", - "ButtonMap": { - "PrimaryButton": { - "actionType": "openPage", - "pageType": "addToSharedCartRtl", - "extraParameters": { - "cmd": "add", - "cart": [ - { - "sku": "715053-0020", - "qty": 1 - } - ] - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Add to cart", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "MoreColors": { - "actionType": "openPage", - "pageType": "exploreZoneMoreClrsRtl", - "extraParameters": { - "sku": "715053-0020" - }, - "tryToReplaceFirst": false, - "title": "More colors", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "SecondaryButton": { - "actionType": "openPage", - "pageType": "getPDPBySKURtl", - "extraParameters": { - "sku": "715053-0020" - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Learn more", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - } - }, - "inStorePurchase": false, - "fallBackImageUrl": "ICON_DFLT_ACCESSORY_IMG", - "accessoryId": "acc4120007", - "inventoryMsg": "In stock, take it with you today.", - "priceMap": { - "netPrice": { - "price": "299.99" - }, - "discountPrice": { - "price": "0" - }, - "originalPrice": { - "price": "299.99" - } - }, - "device": false, - "sorId": "sku1450111", - "stockInStore": true - }, - { - "deviceTitle": "QuietComfort 25 Acoustic Noise Cancelling headphones - Apple devices", - "stockInWarehouse": false, - "colorCode": "#000000", - "colorName": "Black", - "isDevice": false, - "discountFlag": false, - "imageUrl": "https://mobile-edev.vzw.com/dev01/geofencing/instore/images/smart/s7/is/image/VerizonWireless/bose-quietcomfort-25-acoustic-noise-cancelling-headphones-black-iset-715053-0010?$acc-lg$", - "preSelected": true, - "qty": 99974, - "skuId": "715053-0010", - "ButtonMap": { - "PrimaryButton": { - "actionType": "openPage", - "pageType": "addToSharedCartRtl", - "extraParameters": { - "cmd": "add", - "cart": [ - { - "sku": "715053-0010", - "qty": 1 - } - ] - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Add to cart", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "MoreColors": { - "actionType": "openPage", - "pageType": "exploreZoneMoreClrsRtl", - "extraParameters": { - "sku": "715053-0010" - }, - "tryToReplaceFirst": false, - "title": "More colors", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - }, - "SecondaryButton": { - "actionType": "openPage", - "pageType": "getPDPBySKURtl", - "extraParameters": { - "sku": "715053-0010" - }, - "presentationStyle": "push", - "tryToReplaceFirst": false, - "title": "Learn more", - "selected": false, - "disableAction": false, - "appContext": "mobileFirstSS", - "isSelected": false - } - }, - "inStorePurchase": false, - "fallBackImageUrl": "ICON_DFLT_ACCESSORY_IMG", - "accessoryId": "acc4120007", - "inventoryMsg": "In stock, take it with you today.", - "priceMap": { - "netPrice": { - "price": "299.99" - }, - "discountPrice": { - "price": "0" - }, - "originalPrice": { - "price": "299.99" - } - }, - "device": false, - "sorId": "sku1450115", - "stockInStore": true - } - ] - ] - } - } - } -}