diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java index 7807b5571..54fe716cc 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java @@ -146,6 +146,13 @@ public void trackEvent(String name, ReadableMap dataFields) { } } + @ReactMethod + public void updateCart(ReadableArray items) { + IterableLogger.v(TAG, "UpdateCart API"); + + IterableApi.getInstance().updateCart(Serialization.commerceItemsFromReadableArray(items)); + } + @ReactMethod public void trackPurchase(Double total, ReadableArray items, ReadableMap dataFields) { IterableLogger.v(TAG, "TrackPurchase API"); 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<CommerceItem> 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/RNIterableAPI.m b/ios/RNIterableAPI/RNIterableAPI.m index bbebb9f4c..924fab64c 100644 --- a/ios/RNIterableAPI/RNIterableAPI.m +++ b/ios/RNIterableAPI/RNIterableAPI.m @@ -50,6 +50,8 @@ @interface RCT_EXTERN_REMAP_MODULE(RNIterableAPI, ReactIterableAPI, NSObject) appAlreadyRunning: (BOOL) appAlreadyRunning dataFields: (NSDictionary *) dataFields) +RCT_EXTERN_METHOD(updateCart: (NSArray *) items) + 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 3c19813b7..fe8c11d76 100644 --- a/ios/RNIterableAPI/ReactIterableAPI.swift +++ b/ios/RNIterableAPI/ReactIterableAPI.swift @@ -166,6 +166,13 @@ class ReactIterableAPI: RCTEventEmitter { appAlreadyRunning: appAlreadyRunning, dataFields: dataFields) } + + @objc(updateCart:) + func updateCart(items: [[AnyHashable: Any]]) { + ITBInfo() + + IterableAPI.updateCart(items: items.compactMap(CommerceItem.from(dict:))) + } @objc(trackPurchase:items:dataFields:) func trackPurchase(total: NSNumber, 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 3be08087b..934ae323e 100644 --- a/ts/Iterable.ts +++ b/ts/Iterable.ts @@ -170,8 +170,9 @@ class IterableCommerceItem { url?: string imageUrl?: string categories?: Array<string> + dataFields?: any - constructor(id: string, name: string, price: number, quantity: number, sku?: string, description?: string, url?: string, imageUrl?: string, categories?: Array<string>) { + constructor(id: string, name: string, price: number, quantity: number, sku?: string, description?: string, url?: string, imageUrl?: string, categories?: Array<string>, 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 } } @@ -302,6 +304,15 @@ class Iterable { RNIterableAPI.trackPushOpenWithCampaignId(campaignId, templateId, messageId, appAlreadyRunning, dataFields) } + /** + * + * @param {Array<IterableCommerceItem>} items + */ + static updateCart(items: Array<IterableCommerceItem>) { + console.log("updateCart") + RNIterableAPI.updateCart(items) + } + /** * * @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..2b1d70318 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)]) + + expect(MockRNIterableAPI.updateCart).toBeCalledWith( + [new IterableCommerceItem("id1", "Boba Tea", 18, 26)] + ) +}) + test("trackPurchase", () => { Iterable.trackPurchase( 10,