diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java index b130f50c0..6faacef30 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java @@ -112,12 +112,27 @@ public void setEmail(@Nullable String email) { IterableApi.getInstance().setEmail(email); } + @ReactMethod + public void setEmail(@Nullable String email, @Nullable String authToken) { + IterableLogger.d(TAG, "setEmail: " + email + " authToken: " + authToken); + + IterableApi.getInstance().setEmail(email, authToken); + } + @ReactMethod public void updateEmail(String email) { IterableLogger.d(TAG, "updateEmail: " + email); + IterableApi.getInstance().updateEmail(email); } + @ReactMethod + public void updateEmail(String email, @Nullable String authToken) { + IterableLogger.d(TAG, "updateEmail: " + email + " authToken: " + authToken); + + IterableApi.getInstance().updateEmail(email, authToken); + } + @ReactMethod public void getEmail(Promise promise) { promise.resolve(RNIterableInternal.getEmail()); @@ -135,6 +150,13 @@ public void setUserId(@Nullable String userId) { IterableApi.getInstance().setUserId(userId); } + @ReactMethod + public void setUserId(@Nullable String userId, @Nullable String authToken) { + IterableLogger.d(TAG, "setUserId: " + userId + " authToken: " + authToken); + + IterableApi.getInstance().setUserId(userId, authToken); + } + @ReactMethod public void updateUser(ReadableMap dataFields, Boolean mergeNestedObjects) { IterableLogger.v(TAG, "updateUser"); diff --git a/ios/RNIterableAPI/RNIterableAPI.m b/ios/RNIterableAPI/RNIterableAPI.m index 899ad1d04..8850c755a 100644 --- a/ios/RNIterableAPI/RNIterableAPI.m +++ b/ios/RNIterableAPI/RNIterableAPI.m @@ -22,12 +22,14 @@ @interface RCT_EXTERN_REMAP_MODULE(RNIterableAPI, ReactIterableAPI, NSObject) resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) -RCT_EXTERN_METHOD(setEmail: (NSString *) email) +RCT_EXTERN_METHOD(setEmail: (NSString *) email + authToken: (NSString *) authToken) RCT_EXTERN_METHOD(getEmail: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) -RCT_EXTERN_METHOD(setUserId: (NSString *) userId) +RCT_EXTERN_METHOD(setUserId: (NSString *) userId + authToken: (NSString *) authToken) RCT_EXTERN_METHOD(getUserId: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) @@ -80,7 +82,8 @@ @interface RCT_EXTERN_REMAP_MODULE(RNIterableAPI, ReactIterableAPI, NSObject) RCT_EXTERN_METHOD(updateUser: (nonnull NSDictionary *) dataFields mergeNestedObjects: (BOOL) mergeNestedObjects) -RCT_EXTERN_METHOD(updateEmail: (nonnull NSString *) email) +RCT_EXTERN_METHOD(updateEmail: (nonnull NSString *) email + authToken: (NSString *) authToken) RCT_EXTERN_METHOD(handleAppLink: (nonnull NSString *) appLink resolver: (RCTPromiseResolveBlock) resolve diff --git a/ios/RNIterableAPI/ReactIterableAPI.swift b/ios/RNIterableAPI/ReactIterableAPI.swift index 14a9c4ac4..9726d9102 100644 --- a/ios/RNIterableAPI/ReactIterableAPI.swift +++ b/ios/RNIterableAPI/ReactIterableAPI.swift @@ -97,6 +97,13 @@ class ReactIterableAPI: RCTEventEmitter { IterableAPI.email = email } + + @objc(setEmail:authToken:) + func set(email: String?, authToken: String?) { + ITBInfo() + + IterableAPI.setEmail(email, authToken) + } @objc(getEmail:rejecter:) func getEmail(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { @@ -111,6 +118,13 @@ class ReactIterableAPI: RCTEventEmitter { IterableAPI.userId = userId } + + @objc(setUserId:authToken:) + func set(userId: String?, authToken: String?) { + ITBInfo() + + IterableAPI.setUserId(userId, authToken) + } @objc(getUserId:rejecter:) func getUserId(resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { @@ -301,11 +315,15 @@ class ReactIterableAPI: RCTEventEmitter { IterableAPI.updateUser(dataFields, mergeNestedObjects: mergeNestedObjects) } - @objc(updateEmail:) - func updateEmail(email: String) { + @objc(updateEmail:authToken:) + func updateEmail(email: String, with authToken: String?) { ITBInfo() - IterableAPI.updateEmail(email, onSuccess: nil, onFailure: nil) + if let authToken = authToken { + IterableAPI.updateEmail(email, withToken: authToken, onSuccess: nil, onFailure: nil) + } else { + IterableAPI.updateEmail(email, onSuccess: nil, onFailure: nil) + } } @objc(handleAppLink:resolver:rejecter:) diff --git a/ts/Iterable.ts b/ts/Iterable.ts index 6a5d76542..7e49d47fd 100644 --- a/ts/Iterable.ts +++ b/ts/Iterable.ts @@ -167,10 +167,10 @@ class Iterable { * Set the user of the SDK by email address * @param {string | undefined} email the email address of the user */ - static setEmail(email: string | undefined) { + static setEmail(email: string | undefined, authToken?: string | undefined) { Iterable.logger.log("setEmail: " + email) - RNIterableAPI.setEmail(email) + RNIterableAPI.setEmail(email, authToken) } /** @@ -186,10 +186,10 @@ class Iterable { * Set the user of the SDK by ID * @param {string | undefined} userId the ID of the user */ - static setUserId(userId: string | undefined) { + static setUserId(userId: string | undefined, authToken?: string | undefined) { Iterable.logger.log("setUserId: " + userId) - RNIterableAPI.setUserId(userId) + RNIterableAPI.setUserId(userId, authToken) } /** @@ -362,11 +362,12 @@ class Iterable { /** * * @param email the new email to set + * @param authToken the new auth token (JWT) to set with the new email, optional - if null/undefined, no JWT related action will be taken */ - static updateEmail(email: string) { + static updateEmail(email: string, authToken?: string | undefined) { Iterable.logger.log("updateEmail") - RNIterableAPI.updateEmail(email) + RNIterableAPI.updateEmail(email, authToken) } /** diff --git a/ts/__mocks__/MockRNIterableAPI.ts b/ts/__mocks__/MockRNIterableAPI.ts index 4015cf672..3d8d76ad7 100644 --- a/ts/__mocks__/MockRNIterableAPI.ts +++ b/ts/__mocks__/MockRNIterableAPI.ts @@ -13,8 +13,9 @@ export class MockRNIterableAPI { }) } - static setEmail(email?: string) { + static setEmail(email: string, authToken?: string | undefined) { MockRNIterableAPI.email = email + MockRNIterableAPI.token = authToken } static getUserId(): Promise { @@ -23,8 +24,9 @@ export class MockRNIterableAPI { }) } - static setUserId(userId?: string) { + static setUserId(userId: string, authToken?: string | undefined) { MockRNIterableAPI.userId = userId + MockRNIterableAPI.token = authToken } static disableDeviceForCurrentUser = jest.fn() diff --git a/ts/__tests__/Iterable.spec.ts b/ts/__tests__/Iterable.spec.ts index df88a8739..264ea2f02 100644 --- a/ts/__tests__/Iterable.spec.ts +++ b/ts/__tests__/Iterable.spec.ts @@ -24,7 +24,7 @@ beforeEach(() => { Iterable.logger = new IterableLogger(new IterableConfig()) }) -test("set/get email", () => { +test("set/get email (no token)", () => { Iterable.setEmail("user@example.com") return Iterable.getEmail().then(email => { @@ -32,7 +32,7 @@ test("set/get email", () => { }) }) -test("set/get userId", () => { +test("set/get userId (no token)", () => { Iterable.setUserId("user1") return Iterable.getUserId().then(userId => { @@ -136,12 +136,21 @@ test("update user", () => { expect(MockRNIterableAPI.updateUser).toBeCalledWith(dataFields, false) }) -test("update email", () => { +test("update email (no token)", () => { const newEmail = "woo@newemail.com" Iterable.updateEmail(newEmail) - expect(MockRNIterableAPI.updateEmail).toBeCalledWith(newEmail) + expect(MockRNIterableAPI.updateEmail).toBeCalledWith(newEmail, undefined) +}) + +test("update email (with token)", () => { + const newEmail = "woo@newemail.com" + const newToken = "token2" + + Iterable.updateEmail(newEmail, newToken) + + expect(MockRNIterableAPI.updateEmail).toBeCalledWith(newEmail, newToken) }) test("default config values", () => {