From 64a4730b991767f642be3a3ea432559a6479a2e8 Mon Sep 17 00:00:00 2001 From: Jay Kim Date: Wed, 21 Jul 2021 16:50:07 -0700 Subject: [PATCH 1/4] add updateCart API to SDK --- .../reactnative/RNIterableAPIModule.java | 17 +++++++++++++++++ ios/RNIterableAPI/RNIterableAPI.m | 3 +++ ios/RNIterableAPI/ReactIterableAPI.swift | 9 +++++++++ ts/Iterable.ts | 5 +++++ ts/__mocks__/MockRNIterableAPI.ts | 2 ++ ts/__tests__/Iterable.spec.ts | 8 ++++++++ 6 files changed, 44 insertions(+) diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java index acc4d5e01..27634ad75 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java @@ -144,6 +144,23 @@ public void trackEvent(String name, ReadableMap dataFields) { } } + @ReactMethod + public void updateCart(ReadableArray items, ReadableMap dataFields) { + IterableLogger.v(TAG, "UpdateCart API"); + + JSONObject dataFieldsJson = null; + + try { + if (dataFields != null) { + dataFieldsJson = Serialization.convertMapToJson(dataFields); + } + } catch (JSONException e) { + IterableLogger.e(TAG, "Failed converting JSON to object"); + } + + IterableApi.getInstance().updateCart(Serialization.commerceItemsFromReadableArray(items), dataFieldsJson); + } + @ReactMethod public void trackPurchase(Double total, ReadableArray items, ReadableMap dataFields) { IterableLogger.v(TAG, "TrackPurchase API"); diff --git a/ios/RNIterableAPI/RNIterableAPI.m b/ios/RNIterableAPI/RNIterableAPI.m index bbebb9f4c..10e133137 100644 --- a/ios/RNIterableAPI/RNIterableAPI.m +++ b/ios/RNIterableAPI/RNIterableAPI.m @@ -50,6 +50,9 @@ @interface RCT_EXTERN_REMAP_MODULE(RNIterableAPI, ReactIterableAPI, NSObject) appAlreadyRunning: (BOOL) appAlreadyRunning dataFields: (NSDictionary *) dataFields) +RCT_EXTERN_METHOD(updateCart: (NSArray *) items + dataFields: (NSDictionary *) dataFields) + RCT_EXTERN_METHOD(trackPurchase: (nonnull NSNumber *) total items: (NSArray *) items dataFields: (NSDictionary *) dataFields) diff --git a/ios/RNIterableAPI/ReactIterableAPI.swift b/ios/RNIterableAPI/ReactIterableAPI.swift index 30b29b2fa..31b4813a6 100644 --- a/ios/RNIterableAPI/ReactIterableAPI.swift +++ b/ios/RNIterableAPI/ReactIterableAPI.swift @@ -166,6 +166,15 @@ class ReactIterableAPI: RCTEventEmitter { appAlreadyRunning: appAlreadyRunning, dataFields: dataFields) } + + @objc(updateCart:dataFields:) + func updateCart(items: [[AnyHashable: Any]], + dataFields: [AnyHashable: Any]?) { + ITBInfo() + + IterableAPI.updateCart(items: items.compactMap(CommerceItem.from(dict:)), + dataFields: dataFields) + } @objc(trackPurchase:items:dataFields:) func trackPurchase(total: NSNumber, diff --git a/ts/Iterable.ts b/ts/Iterable.ts index 3be08087b..c00cac193 100644 --- a/ts/Iterable.ts +++ b/ts/Iterable.ts @@ -302,6 +302,11 @@ class Iterable { RNIterableAPI.trackPushOpenWithCampaignId(campaignId, templateId, messageId, appAlreadyRunning, dataFields) } + static updateCart(items: Array, dataFields: any | undefined) { + console.log("updateCart") + RNIterableAPI.updateCart(items, dataFields) + } + /** * * @param {number} total diff --git a/ts/__mocks__/MockRNIterableAPI.ts b/ts/__mocks__/MockRNIterableAPI.ts index cf036a1cd..4015cf672 100644 --- a/ts/__mocks__/MockRNIterableAPI.ts +++ b/ts/__mocks__/MockRNIterableAPI.ts @@ -31,6 +31,8 @@ export class MockRNIterableAPI { static trackPushOpenWithCampaignId = jest.fn() + static updateCart = jest.fn() + static trackPurchase = jest.fn() static trackInAppOpen = jest.fn() diff --git a/ts/__tests__/Iterable.spec.ts b/ts/__tests__/Iterable.spec.ts index 4c851b507..6c4d4c0c5 100644 --- a/ts/__tests__/Iterable.spec.ts +++ b/ts/__tests__/Iterable.spec.ts @@ -57,6 +57,14 @@ test("trackPushOpenWithCampaignId", () => { ) }) +test("updateCart", () => { + Iterable.updateCart([new IterableCommerceItem("id1", "Boba Tea", 18, 26)], { "dataFieldKey": "dataFieldValue" }) + + expect(MockRNIterableAPI.updateCart).toBeCalledWith( + [new IterableCommerceItem("id1", "Boba Tea", 18, 26)], { "dataFieldKey": "dataFieldValue" } + ) +}) + test("trackPurchase", () => { Iterable.trackPurchase( 10, From d902455e670945868c2fca1b53718f1d04510694 Mon Sep 17 00:00:00 2001 From: Jay Kim Date: Mon, 26 Jul 2021 17:24:42 -0700 Subject: [PATCH 2/4] remove top level dataFields --- .../com/iterable/reactnative/RNIterableAPIModule.java | 4 ++-- ios/RNIterableAPI/RNIterableAPI.m | 3 +-- ios/RNIterableAPI/ReactIterableAPI.swift | 8 +++----- ts/Iterable.ts | 8 ++++++-- ts/__tests__/Iterable.spec.ts | 4 ++-- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java index 27634ad75..e73e96206 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java @@ -145,7 +145,7 @@ public void trackEvent(String name, ReadableMap dataFields) { } @ReactMethod - public void updateCart(ReadableArray items, ReadableMap dataFields) { + public void updateCart(ReadableArray items) { IterableLogger.v(TAG, "UpdateCart API"); JSONObject dataFieldsJson = null; @@ -158,7 +158,7 @@ public void updateCart(ReadableArray items, ReadableMap dataFields) { IterableLogger.e(TAG, "Failed converting JSON to object"); } - IterableApi.getInstance().updateCart(Serialization.commerceItemsFromReadableArray(items), dataFieldsJson); + IterableApi.getInstance().updateCart(Serialization.commerceItemsFromReadableArray(items)); } @ReactMethod diff --git a/ios/RNIterableAPI/RNIterableAPI.m b/ios/RNIterableAPI/RNIterableAPI.m index 10e133137..924fab64c 100644 --- a/ios/RNIterableAPI/RNIterableAPI.m +++ b/ios/RNIterableAPI/RNIterableAPI.m @@ -50,8 +50,7 @@ @interface RCT_EXTERN_REMAP_MODULE(RNIterableAPI, ReactIterableAPI, NSObject) appAlreadyRunning: (BOOL) appAlreadyRunning dataFields: (NSDictionary *) dataFields) -RCT_EXTERN_METHOD(updateCart: (NSArray *) items - dataFields: (NSDictionary *) dataFields) +RCT_EXTERN_METHOD(updateCart: (NSArray *) items) RCT_EXTERN_METHOD(trackPurchase: (nonnull NSNumber *) total items: (NSArray *) items diff --git a/ios/RNIterableAPI/ReactIterableAPI.swift b/ios/RNIterableAPI/ReactIterableAPI.swift index 31b4813a6..3f6ae3891 100644 --- a/ios/RNIterableAPI/ReactIterableAPI.swift +++ b/ios/RNIterableAPI/ReactIterableAPI.swift @@ -167,13 +167,11 @@ class ReactIterableAPI: RCTEventEmitter { dataFields: dataFields) } - @objc(updateCart:dataFields:) - func updateCart(items: [[AnyHashable: Any]], - dataFields: [AnyHashable: Any]?) { + @objc(updateCart:) + func updateCart(items: [[AnyHashable: Any]]) { ITBInfo() - IterableAPI.updateCart(items: items.compactMap(CommerceItem.from(dict:)), - dataFields: dataFields) + IterableAPI.updateCart(items: items.compactMap(CommerceItem.from(dict:))) } @objc(trackPurchase:items:dataFields:) diff --git a/ts/Iterable.ts b/ts/Iterable.ts index c00cac193..ea6e6fc22 100644 --- a/ts/Iterable.ts +++ b/ts/Iterable.ts @@ -302,9 +302,13 @@ class Iterable { RNIterableAPI.trackPushOpenWithCampaignId(campaignId, templateId, messageId, appAlreadyRunning, dataFields) } - static updateCart(items: Array, dataFields: any | undefined) { + /** + * + * @param {Array} items + */ + static updateCart(items: Array) { console.log("updateCart") - RNIterableAPI.updateCart(items, dataFields) + RNIterableAPI.updateCart(items) } /** diff --git a/ts/__tests__/Iterable.spec.ts b/ts/__tests__/Iterable.spec.ts index 6c4d4c0c5..2b1d70318 100644 --- a/ts/__tests__/Iterable.spec.ts +++ b/ts/__tests__/Iterable.spec.ts @@ -58,10 +58,10 @@ test("trackPushOpenWithCampaignId", () => { }) test("updateCart", () => { - Iterable.updateCart([new IterableCommerceItem("id1", "Boba Tea", 18, 26)], { "dataFieldKey": "dataFieldValue" }) + Iterable.updateCart([new IterableCommerceItem("id1", "Boba Tea", 18, 26)]) expect(MockRNIterableAPI.updateCart).toBeCalledWith( - [new IterableCommerceItem("id1", "Boba Tea", 18, 26)], { "dataFieldKey": "dataFieldValue" } + [new IterableCommerceItem("id1", "Boba Tea", 18, 26)] ) }) From c8faaa5244bfe54f5c82007107782adc860772ed Mon Sep 17 00:00:00 2001 From: Jay Kim Date: Tue, 3 Aug 2021 17:19:04 -0700 Subject: [PATCH 3/4] add dataFields to CommerceItem serialization --- .../main/java/com/iterable/reactnative/Serialization.java | 6 ++++-- ios/RNIterableAPI/Serialization.swift | 4 +++- ts/Iterable.ts | 4 +++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/com/iterable/reactnative/Serialization.java b/android/src/main/java/com/iterable/reactnative/Serialization.java index f8376f674..189c8fe0e 100644 --- a/android/src/main/java/com/iterable/reactnative/Serialization.java +++ b/android/src/main/java/com/iterable/reactnative/Serialization.java @@ -81,9 +81,9 @@ static List commerceItemsFromReadableArray(ReadableArray array) { } static CommerceItem commerceItemFromMap(JSONObject itemMap) throws JSONException { - String[] categories = null; JSONArray categoriesArray = itemMap.optJSONArray("categories"); + if (categoriesArray != null) { for (int i = 0; i < categoriesArray.length(); i++) { if (categories == null) { @@ -92,6 +92,7 @@ static CommerceItem commerceItemFromMap(JSONObject itemMap) throws JSONException categories[i] = categoriesArray.getString(i); } } + return new CommerceItem(itemMap.getString("id"), itemMap.getString("name"), itemMap.getDouble("price"), @@ -100,7 +101,8 @@ static CommerceItem commerceItemFromMap(JSONObject itemMap) throws JSONException itemMap.optString("description", null), itemMap.optString("url", null), itemMap.optString("imageUrl", null), - categories + categories, + itemMap.optJSONObject("dataFields") ); } diff --git a/ios/RNIterableAPI/Serialization.swift b/ios/RNIterableAPI/Serialization.swift index 8f5cfac61..67b18ad2f 100644 --- a/ios/RNIterableAPI/Serialization.swift +++ b/ios/RNIterableAPI/Serialization.swift @@ -90,6 +90,7 @@ extension CommerceItem { let url = dict["url"] as? String let imageUrl = dict["imageUrl"] as? String let categories = dict["categories"] as? [String] + let dataFields = dict["dataFields"] as? [AnyHashable: Any] return CommerceItem(id: id, name: name, @@ -99,7 +100,8 @@ extension CommerceItem { description: description, url: url, imageUrl: imageUrl, - categories: categories) + categories: categories, + dataFields: dataFields) } } diff --git a/ts/Iterable.ts b/ts/Iterable.ts index ea6e6fc22..934ae323e 100644 --- a/ts/Iterable.ts +++ b/ts/Iterable.ts @@ -170,8 +170,9 @@ class IterableCommerceItem { url?: string imageUrl?: string categories?: Array + dataFields?: any - constructor(id: string, name: string, price: number, quantity: number, sku?: string, description?: string, url?: string, imageUrl?: string, categories?: Array) { + constructor(id: string, name: string, price: number, quantity: number, sku?: string, description?: string, url?: string, imageUrl?: string, categories?: Array, dataFields?: any | undefined) { this.id = id this.name = name this.price = price @@ -181,6 +182,7 @@ class IterableCommerceItem { this.url = url this.imageUrl = imageUrl this.categories = categories + this.dataFields = dataFields } } From 83f4bf8f7d7e3fe2e88e1868adbbfe829f59c47a Mon Sep 17 00:00:00 2001 From: Jay Kim Date: Thu, 5 Aug 2021 08:36:38 -0700 Subject: [PATCH 4/4] get rid of dataFields parameter in updateCart --- .../com/iterable/reactnative/RNIterableAPIModule.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java index e73e96206..88b86aeee 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java @@ -148,16 +148,6 @@ public void trackEvent(String name, ReadableMap dataFields) { public void updateCart(ReadableArray items) { IterableLogger.v(TAG, "UpdateCart API"); - JSONObject dataFieldsJson = null; - - try { - if (dataFields != null) { - dataFieldsJson = Serialization.convertMapToJson(dataFields); - } - } catch (JSONException e) { - IterableLogger.e(TAG, "Failed converting JSON to object"); - } - IterableApi.getInstance().updateCart(Serialization.commerceItemsFromReadableArray(items)); }