From 1b93a248cf2cb3960711e9d278e4c726174838d8 Mon Sep 17 00:00:00 2001 From: kilian-tennyson Date: Tue, 1 Jul 2025 14:26:11 +0100 Subject: [PATCH 1/6] feat: Adding react native support for jwt --- .../reactnative/IntercomErrorCodes.java | 1 + .../intercom/reactnative/IntercomModule.java | 13 +++ example/ios/Podfile.lock | 86 +++++++++---------- intercom-react-native.podspec | 2 +- ios/IntercomModule.m | 13 ++- src/index.tsx | 16 +++- 6 files changed, 85 insertions(+), 46 deletions(-) diff --git a/android/src/main/java/com/intercom/reactnative/IntercomErrorCodes.java b/android/src/main/java/com/intercom/reactnative/IntercomErrorCodes.java index 68b7ba76..b2114bd4 100644 --- a/android/src/main/java/com/intercom/reactnative/IntercomErrorCodes.java +++ b/android/src/main/java/com/intercom/reactnative/IntercomErrorCodes.java @@ -9,6 +9,7 @@ public class IntercomErrorCodes { public static final String LOGOUT = "106"; public static final String SET_LOG_LEVEL = "107"; public static final String GET_UNREAD_CONVERSATION = "108"; + public static final String SET_USER_JWT = "109"; public static final String DISPLAY_MESSENGER = "201"; public static final String DISPLAY_MESSENGER_COMPOSER = "202"; public static final String DISPLAY_CONTENT = "203"; diff --git a/android/src/main/java/com/intercom/reactnative/IntercomModule.java b/android/src/main/java/com/intercom/reactnative/IntercomModule.java index 2b94bab5..a18736b5 100644 --- a/android/src/main/java/com/intercom/reactnative/IntercomModule.java +++ b/android/src/main/java/com/intercom/reactnative/IntercomModule.java @@ -513,6 +513,19 @@ public void setBottomPadding(int paddingBottom, Promise promise) { } } + @ReactMethod + public void setUserJwt(String jwt, Promise promise) { + try { + Intercom.client().setUserJwt(jwt); + Log.d(NAME, "Setting JWT"); + promise.resolve(true); + } catch (Exception err) { + Log.e(NAME, "Error Setting JWT:"); + Log.e(NAME, err.toString()); + promise.reject(IntercomErrorCodes.SET_USER_JWT, err.toString()); + } + } + public static synchronized void initialize(Application application, String apiKey, String appId) { String sdkVersion = BuildConfig.INTERCOM_VERSION_NAME; ReactNativeHeaderInterceptor.setReactNativeVersion(application.getApplicationContext(), sdkVersion); diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index a251abad..f3695626 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -4,9 +4,9 @@ PODS: - FBLazyVector (0.74.0) - fmt (9.1.0) - glog (0.3.5) - - Intercom (18.6.1) - - intercom-react-native (8.3.0): - - Intercom (~> 18.6.1) + - Intercom (18.7.3) + - intercom-react-native (8.5.0): + - Intercom (~> 18.7.3) - React-Core - RCT-Folly (2024.01.01.00): - boost @@ -911,9 +911,9 @@ PODS: - React-Mapbuffer (0.74.0): - glog - React-debug - - react-native-config (1.5.3): - - react-native-config/App (= 1.5.3) - - react-native-config/App (1.5.3): + - react-native-config (1.5.5): + - react-native-config/App (= 1.5.5) + - react-native-config/App (1.5.5): - React-Core - React-nativeconfig (0.74.0) - React-NativeModulesApple (0.74.0): @@ -1313,56 +1313,56 @@ SPEC CHECKSUMS: FBLazyVector: 026c8f4ae67b06e088ae01baa2271ef8a26c0e8c fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 - Intercom: e0b4c525b646ec91a7044136057956937a5798c9 - intercom-react-native: 452b614d67d2cb3aac5929d925f6fd3b188254e8 - RCT-Folly: 5f972de9f7d384c7d0e7380dd7da506228e568f5 + Intercom: 93c6f5d9815b34bf2a7e5f03bcf7b6e08c1a4788 + intercom-react-native: 985eb561fd1eb0765f86a3332a89a4f31ce3dfaa + RCT-Folly: 045d6ecaa59d826c5736dfba0b2f4083ff8d79df RCTDeprecation: 3ca8b6c36bfb302e1895b72cfe7db0de0c92cd47 RCTRequired: 9fc183af555fd0c89a366c34c1ae70b7e03b1dc5 RCTTypeSafety: db1dd5ad1081a5e160d30bb29ef922693d5ac4b1 React: 8650d592d90b99097504b8dcfebab883972aed71 React-callinvoker: 6bb8b399ab8cec59e52458c3a592aa1fca130b68 - React-Codegen: fbad87d0dc7c5bc1536b25bc5cf2f19a1449e438 - React-Core: ab1b60c382b7b79c374b68918f856826ec7f02a9 - React-CoreModules: c5791800e490979b15b819e13ceaee42aa4a2672 - React-cxxreact: 7a5de9c31527a3a36b02caa3540ab55080a6448a + React-Codegen: 0c5fb82424bc21119c79da38b93ab8a62bcf5f9f + React-Core: 6dc6cccf86dd6eb53e5f689211ceb2037d65d3a6 + React-CoreModules: 087c24b785afc79d29d23bffe7b02f79bb00cf76 + React-cxxreact: 8b5a860f8c673ba4f98a3e30b41d4a2ae20f3a31 React-debug: 41175f3e30dfa8af6eab2631261e1eac26307f9f - React-Fabric: c96fe05717ffb9ab37f7533e9697e68932a621d4 - React-FabricImage: 837a4d681f01084888c7ed55df848eb3611c5691 + React-Fabric: 109d6c97fb4856f3edd848d5d896b71dedeaa361 + React-FabricImage: de46a64a0ca4b0409a0acfb2f5ccdf1195f2d8e2 React-featureflags: 5e7e78c607661fe7f72bc38c6f03736e0876753a - React-graphics: ea6e3c3f77683565552986548ba6a2938cb83251 - React-ImageManager: 49a461cd14ed15749fe7371afb1924e8a72aecc1 + React-graphics: 354adf8693bf849e696bf5096abc8cdc22c78ab4 + React-ImageManager: 74e0898e24b12c45c40019b8558a1310d0b2a47c React-jsc: 8c066d00deacb809aba74cbe3fc94b76d5ae6b7e - React-jserrorhandler: bccc0691bf5195f4da1292a4d2fbaa13fa895f89 - React-jsi: 20c796a75f92a22b083ebe78005b50fecfe025bd - React-jsiexecutor: 2ac1b518e12547c6389d6b314f4d17b283feab7a - React-jsinspector: 1cdd1dbae4aa9c455da2fec9ecda2381dda54695 - React-jsitracing: d30048b056e8c9673dfbe67813bdb874c03558a5 - React-logger: 5ae0978955199c132e71e8cf7797f619a6d17164 - React-Mapbuffer: 3b85b3778e447cd1f06d353b8e967af50f272829 - react-native-config: ea75335a7cca1d3326de1da384227e580a7c082e + React-jserrorhandler: 33cb327f5c6e1571b362f1a9c762ff839a5adb15 + React-jsi: 9ab5aa12ce6d9238a150e81f43c99b97e53a48a7 + React-jsiexecutor: c30f9dda4147c7339cffc64d6ad596c6faddddb9 + React-jsinspector: 50cfdab96549beab8d6554e39f3d36ed2ba23078 + React-jsitracing: 36a2bbc272300313653d980de5ab700ec86c534a + React-logger: 03f2f7b955cfe24593a2b8c9705c23e142d1ad24 + React-Mapbuffer: 5e05d78fe6505f4a054b86f415733d4ad02dd314 + react-native-config: 3367df9c1f25bb96197007ec531c7087ed4554c3 React-nativeconfig: 951ec32f632e81cbd7d40aebb3211313251c092e - React-NativeModulesApple: 612f931b1e79736f2d59353979042a424fb314c8 + React-NativeModulesApple: add06f130d91f3ca13b92d35861fdd6fdb9157e6 React-perflogger: 271f1111779fef70f9502d1d38da5132e5585230 React-RCTActionSheet: 5d6fb9adb11ab1bfbce6695a2b785767e4658c53 - React-RCTAnimation: 0d11291f869c8a15cff4fd21dca031a83f9e8527 - React-RCTAppDelegate: 77a7b9a27f10aa55da5a44132be281a15cc0848c - React-RCTBlob: 72759b7acf86de079c87a1562a440612c57da1b0 - React-RCTFabric: a0345a090221724893e0ea20ffab73324f4b6520 - React-RCTImage: 80ba9b23ecf87536b14c5eb38bd76f9d2b842c8a - React-RCTLinking: afd22b0854eba28eb277baad45c37ada5ef77bc3 - React-RCTNetwork: ffe5a1021f5a0bcbdf7944665dc44856493ab5bd - React-RCTSettings: f8472ee7998de8d186c198e820c40fcaf9ce4571 - React-RCTText: f556484bf1ba49a7c9b1ce1138608657d80e0bcb - React-RCTVibration: 236755b4231073ebac6cabc3864edb4cd6308d89 - React-rendererdebug: c1dac9f04b12f05929b6113a50aec5fcd5132b94 + React-RCTAnimation: 86ace32c56e69b3822e7e5184ea83a79d47fc7b9 + React-RCTAppDelegate: 6379a11a49fd0be615dc2e23da0c8a84c52ec65c + React-RCTBlob: 558daf7c11715ef24d97a0be5ccc3b209753682c + React-RCTFabric: eb4b1fc3718040717f17114b7782a519987bd7c4 + React-RCTImage: b482f07cfdbe8e413edbf9d85953cecdb569472c + React-RCTLinking: fbd73a66cab34df69b2389c17f200e4722890fd9 + React-RCTNetwork: fbdd716fbd6e53feb6d8e00eeb85e8184ad42ac8 + React-RCTSettings: 11c3051b965593988298a3f5fb39e23bf6f7df9f + React-RCTText: f240b4d39c36c295204d29e7634a2fac450b6d29 + React-RCTVibration: 1750f80b39e1ad9b4f509f4fdf19a803f7ab0d38 + React-rendererdebug: a89ffa25c7670de8f22e0b322dfdd8333bc0d126 React-rncore: a3ab9e7271a5c692918e2a483beb900ff0a51169 - React-RuntimeApple: 7fae2c2c7aa890e78830465f5ca7bd13b91939ed - React-RuntimeCore: 38f46aedbab24c4887cf763b8d0c676a059f95e6 + React-RuntimeApple: dbaeec3eb503510c93e91d49e92fc39c0ccf7e3a + React-RuntimeCore: 67e737df40b8815f65671fbaf8f75440e7fba96e React-runtimeexecutor: 4471221991b6e518466a0422fbeb2158c07c36e1 - React-runtimescheduler: 1b7a5ce47ba798252278727248a3f50e991e2631 - React-utils: 5eded69fc2a3be3f1823a64c6aa7b202e8e5dd94 - ReactCommon: 649ff2cbfc22342f119b43af78ee85bad61e8919 - RNCAsyncStorage: b6410dead2732b5c72a7fdb1ecb5651bbcf4674b + React-runtimescheduler: 203e25504974651c4472ad00e035658d32002305 + React-utils: 67c666fd04996cdb6bba26590586753d3e8ff7ed + ReactCommon: 53dbd9a55e29188ded016078708d1da8de2db19d + RNCAsyncStorage: ec53e44dc3e75b44aa2a9f37618a49c3bc080a7a SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Yoga: 56f906bf6c11c931588191dde1229fd3e4e3d557 diff --git a/intercom-react-native.podspec b/intercom-react-native.podspec index 962eab99..4934af23 100644 --- a/intercom-react-native.podspec +++ b/intercom-react-native.podspec @@ -20,5 +20,5 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "DEFINES_MODULE" => "YES" } s.dependency "React-Core" - s.dependency "Intercom", '~> 18.6.1' + s.dependency "Intercom", '~> 18.7.3' end diff --git a/ios/IntercomModule.m b/ios/IntercomModule.m index 5db7318c..4671ddf0 100644 --- a/ios/IntercomModule.m +++ b/ios/IntercomModule.m @@ -15,6 +15,7 @@ @implementation IntercomModule NSString *UPDATE_USER = @"104"; NSString *LOG_EVENT = @"105"; NSString *UNREAD_CONVERSATION_COUNT = @"107"; +NSString *SET_USER_JWT = @"108"; NSString *SEND_TOKEN_TO_INTERCOM = @"302"; NSString *FETCH_HELP_CENTER_COLLECTIONS = @"901"; NSString *FETCH_HELP_CENTER_COLLECTION = @"902"; @@ -154,7 +155,6 @@ - (NSData *)dataFromHexString:(NSString *)string { } }; - #pragma mark - Events RCT_EXPORT_METHOD(logEvent:(NSString *)eventName @@ -313,6 +313,17 @@ - (NSData *)dataFromHexString:(NSString *)string { resolve(@(YES)); }; +RCT_EXPORT_METHOD(setUserJwt:(NSString *)jwt + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) { + @try { + [Intercom setUserJwt:jwt]; + resolve(@(YES)); + } @catch (NSException *exception) { + reject(@SET_USER_JWT, @"Error in setUserJwt", [self exceptionToError:exception :@"SET_USER_JWT" :@"setUserJwt"]); + } +}; + RCT_EXPORT_METHOD(setInAppMessageVisibility:(NSString *)visibility resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { diff --git a/src/index.tsx b/src/index.tsx index 3bcc776f..deea804c 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -288,6 +288,20 @@ export type IntercomType = { */ setLogLevel(logLevel: LogLevelType): Promise; + /** + Sets a JWT token for the user, necessary for using the Messenger + when Messenger Security is enforced. This is an improvement to Identity Verification. + + Secure your Messenger to make sure that bad actors can't impersonate your users, + see their conversation history or make unauthorised updates to data. + Add commentMore actions + This should be called before any user login takes place. Learn more [here](https://developers.intercom.com/installing-intercom/ios/secure-your-messenger) + + Parameters: + - jwt: A JWT token signed with your app's secret key. + */ + setUserJwt(JWT: String): Promise; + /** * Add an event listener for the supported event types. */ @@ -342,7 +356,7 @@ const Intercom: IntercomType = { sendTokenToIntercom: (token) => IntercomModule.sendTokenToIntercom(token), setLogLevel: (logLevel) => IntercomModule.setLogLevel(logLevel), - + setUserJwt: (jwt) => IntercomModule.setUserJwt(jwt), addEventListener: (event, callback) => { event === IntercomEvents.IntercomUnreadCountDidChange && Platform.OS === 'android' && From 4ac1f7ea4d9c500e3a130493641c0a5e5e57a254 Mon Sep 17 00:00:00 2001 From: kilian-tennyson Date: Wed, 2 Jul 2025 10:40:56 +0100 Subject: [PATCH 2/6] fix: removing typo from IntercomModule.m to get passing build --- ios/IntercomModule.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/IntercomModule.m b/ios/IntercomModule.m index 4671ddf0..225f3212 100644 --- a/ios/IntercomModule.m +++ b/ios/IntercomModule.m @@ -320,7 +320,7 @@ - (NSData *)dataFromHexString:(NSString *)string { [Intercom setUserJwt:jwt]; resolve(@(YES)); } @catch (NSException *exception) { - reject(@SET_USER_JWT, @"Error in setUserJwt", [self exceptionToError:exception :@"SET_USER_JWT" :@"setUserJwt"]); + reject(SET_USER_JWT, @"Error in setUserJwt", [self exceptionToError:exception :@"SET_USER_JWT" :@"setUserJwt"]); } }; From 01d131743ba217d396eed611f85d94683fc6dd64 Mon Sep 17 00:00:00 2001 From: kilian-tennyson Date: Wed, 2 Jul 2025 11:02:44 +0100 Subject: [PATCH 3/6] chore: keeping error codes the same for consistency --- ios/IntercomModule.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/IntercomModule.m b/ios/IntercomModule.m index 225f3212..49adc545 100644 --- a/ios/IntercomModule.m +++ b/ios/IntercomModule.m @@ -15,7 +15,7 @@ @implementation IntercomModule NSString *UPDATE_USER = @"104"; NSString *LOG_EVENT = @"105"; NSString *UNREAD_CONVERSATION_COUNT = @"107"; -NSString *SET_USER_JWT = @"108"; +NSString *SET_USER_JWT = @"109"; NSString *SEND_TOKEN_TO_INTERCOM = @"302"; NSString *FETCH_HELP_CENTER_COLLECTIONS = @"901"; NSString *FETCH_HELP_CENTER_COLLECTION = @"902"; From 62afd0fee89732013ec5fb394d7d68eeaba737fd Mon Sep 17 00:00:00 2001 From: kilian-tennyson Date: Wed, 2 Jul 2025 15:02:46 +0100 Subject: [PATCH 4/6] chore: adding new API to README --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index 2ec524ad..dabe6e73 100644 --- a/README.md +++ b/README.md @@ -1092,6 +1092,27 @@ ___ ___ +### `Intercom.setUserJwt(JWT)` + +Sets a JWT token for the user, necessary for using the Messenger when Messenger Security is enforced. This is an +improvement to Identity Verification. + +Secure your Messenger to make sure that bad actors can't impersonate your users, see their conversation history or make +unauthorized updates to data. + +This should be called before any user login takes place. + +### Options + +| Type | Type | Required | +|------|--------|----------| +| JWT | string | yes | + +### Returns + +`Promise` +___ + ## Author 👤 **Intercom (https://www.intercom.com/)** From 30a313b62d3abcb2c54d63b614ed19df1cb23bd7 Mon Sep 17 00:00:00 2001 From: kilian-tennyson Date: Wed, 2 Jul 2025 15:06:54 +0100 Subject: [PATCH 5/6] chore: fix typo in function description --- src/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index deea804c..9b304c21 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -294,8 +294,8 @@ export type IntercomType = { Secure your Messenger to make sure that bad actors can't impersonate your users, see their conversation history or make unauthorised updates to data. - Add commentMore actions - This should be called before any user login takes place. Learn more [here](https://developers.intercom.com/installing-intercom/ios/secure-your-messenger) + + This should be called before any user login takes place. Parameters: - jwt: A JWT token signed with your app's secret key. From 901dfb6cd402fbfc3626b08eafdd3d6e12b62b65 Mon Sep 17 00:00:00 2001 From: kilian-tennyson Date: Wed, 2 Jul 2025 15:53:54 +0100 Subject: [PATCH 6/6] none: bumping version for release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 57085aab..f1a243bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@intercom/intercom-react-native", - "version": "8.5.0", + "version": "8.6.0", "description": "React Native wrapper to bridge our iOS and Android SDK", "main": "lib/commonjs/index", "module": "lib/module/index",