Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 34 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ func application(_ application: UIApplication, didFinishLaunchingWithOptions lau
Intercom.setApiKey("<Your iOS API Key>", forAppId: "<Your App ID>")
....
}

```

#### iOS: Permissions
Expand Down Expand Up @@ -1206,6 +1206,39 @@ This should be called before any user login takes place.

---

### `Intercom.setAuthTokens(authTokens)`

Provide Intercom with your auth tokens which can be used for functionality such as Custom Actions with Data Connectors. You can provide multiple
tokens at once. To create tokens:
1. Go to Settings > Integrations > Authentication in your Intercom workspace
2. Create a new token with "User" type
3. Configure the token prefix and header as needed

Learn more: https://www.intercom.com/help/en/articles/6615543-setting-up-data-connectors-authentication

This should be called after any user login takes place.

**Note:** This is separate from `setUserJwt()` which is for Messenger Security. `setAuthTokens()` passes JWT tokens to
Data Connectors (e.g., Fin Actions), which use these in `Authorization: Bearer <token>` headers for API requests.

### Options

| Name | Type | Required | Description |
| ---------- | ------------------------------- | -------- | --------------------------------------------------- |
| authTokens | `{ [key: string]: string }` | yes | An object with token names as keys and JWT strings as values |

### Example

```typescript
Intercom.setAuthTokens({ security_token: "jwt_here" });
```

### Returns

`Promise<boolean>`

---

## Author

👤 **Intercom (https://www.intercom.com/)**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class IntercomErrorCodes {
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 SET_AUTH_TOKENS = "110";
public static final String DISPLAY_MESSENGER = "201";
public static final String DISPLAY_MESSENGER_COMPOSER = "202";
public static final String DISPLAY_CONTENT = "203";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.util.List;
import java.util.Map;

import io.intercom.android.sdk.AuthToken;
import io.intercom.android.sdk.Company;
import io.intercom.android.sdk.Intercom;
import io.intercom.android.sdk.UserAttributes;
Expand Down Expand Up @@ -255,4 +256,23 @@ public static WritableMap deconstructRegistration(Registration registration) {
}
return registrationMap;
}

public static List<AuthToken> buildAuthTokensList(ReadableMap readableMap) {
List<AuthToken> authTokens = new ArrayList<>();
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();

while (iterator.hasNextKey()) {
String key = iterator.nextKey();
ReadableType type = readableMap.getType(key);

if (type == ReadableType.String) {
String value = readableMap.getString(key);
if (key != null && value != null && !key.isEmpty() && !value.isEmpty()) {
authTokens.add(new AuthToken(key, value));
}
}
}

return authTokens;
}
}
23 changes: 23 additions & 0 deletions android/src/newarch/IntercomModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,29 @@ public void setUserJwt(String jwt, Promise promise) {
}
}

@ReactMethod
public void setAuthTokens(ReadableMap authTokens, Promise promise) {
try {
List<io.intercom.android.sdk.AuthToken> authTokensList = IntercomHelpers.buildAuthTokensList(authTokens);
Intercom.client().setAuthTokens(authTokensList, new IntercomStatusCallback() {
@Override
public void onSuccess() {
promise.resolve(true);
}

@Override
public void onFailure(@NonNull IntercomError intercomError) {
Log.e("ERROR", intercomError.getErrorMessage());
promise.reject(String.valueOf(intercomError.getErrorCode()), intercomError.getErrorMessage());
}
});
} catch (Exception err) {
Log.e(NAME, "setAuthTokens error:");
Log.e(NAME, err.toString());
promise.reject(IntercomErrorCodes.SET_AUTH_TOKENS, err.toString());
}
}

@ReactMethod
public void setNeedsStatusBarAppearanceUpdate(Promise promise) {
// iOS-only method, no-op on Android
Expand Down
23 changes: 23 additions & 0 deletions android/src/oldarch/IntercomModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,29 @@ public void setUserJwt(String jwt, Promise promise) {
}
}

@ReactMethod
public void setAuthTokens(ReadableMap authTokens, Promise promise) {
try {
List<io.intercom.android.sdk.AuthToken> authTokensList = IntercomHelpers.buildAuthTokensList(authTokens);
Intercom.client().setAuthTokens(authTokensList, new IntercomStatusCallback() {
@Override
public void onSuccess() {
promise.resolve(true);
}

@Override
public void onFailure(@NonNull IntercomError intercomError) {
Log.e("ERROR", intercomError.getErrorMessage());
promise.reject(String.valueOf(intercomError.getErrorCode()), intercomError.getErrorMessage());
}
});
} catch (Exception err) {
Log.e(NAME, "setAuthTokens error:");
Log.e(NAME, err.toString());
promise.reject(IntercomErrorCodes.SET_AUTH_TOKENS, err.toString());
}
}

public static synchronized void initialize(Application application, String apiKey, String appId) {
String sdkVersion = BuildConfig.INTERCOM_VERSION_NAME;
ReactNativeHeaderInterceptor.setReactNativeVersion(application.getApplicationContext(), sdkVersion);
Expand Down
17 changes: 17 additions & 0 deletions ios/IntercomModule.m
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ @implementation IntercomModule
NSString *LOG_EVENT = @"105";
NSString *UNREAD_CONVERSATION_COUNT = @"107";
NSString *SET_USER_JWT = @"109";
NSString *SET_AUTH_TOKENS = @"110";
NSString *SEND_TOKEN_TO_INTERCOM = @"302";
NSString *FETCH_HELP_CENTER_COLLECTIONS = @"901";
NSString *FETCH_HELP_CENTER_COLLECTION = @"902";
Expand Down Expand Up @@ -331,6 +332,22 @@ - (NSData *)dataFromHexString:(NSString *)string {
}
};

RCT_EXPORT_METHOD(setAuthTokens:(NSDictionary *)authTokens
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject) {
@try {
[Intercom setAuthTokens:authTokens
success:^{
resolve(@(YES));
}
failure:^(NSError * _Nonnull error) {
reject(SET_AUTH_TOKENS, @"Error in setAuthTokens", [self removeNullUnderlyingError:error]);
}];
} @catch (NSException *exception) {
reject(SET_AUTH_TOKENS, @"Error in setAuthTokens", [self exceptionToError:exception :SET_AUTH_TOKENS :@"setAuthTokens"]);
}
};

RCT_EXPORT_METHOD(setInAppMessageVisibility:(NSString *)visibility
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject) {
Expand Down
1 change: 1 addition & 0 deletions src/NativeIntercomSpec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export interface Spec extends TurboModule {
setLogLevel(logLevel: string): Promise<boolean>;
setThemeMode(themeMode: string): Promise<boolean>;
setUserJwt(jwt: string): Promise<boolean>;
setAuthTokens(authTokens: Object): Promise<boolean>;
}

export default TurboModuleRegistry.getEnforcing<Spec>('IntercomModule');
16 changes: 16 additions & 0 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,21 @@ export type IntercomType = {
*/
setUserJwt(jwt: string): Promise<boolean>;

/**
* Provide Intercom with your auth tokens which can be used for functionality
* such as Custom Actions with Data Connectors. You can provide multiple tokens at once. To create tokens:
* 1. Go to Settings > Integrations > Authentication in your Intercom workspace
* 2. Create a new token with "User" type
* 3. Configure the token prefix and header as needed
* Learn more: https://www.intercom.com/help/en/articles/6615543-setting-up-data-connectors-authentication
*
* This should be called after any user login takes place.
*
* @param authTokens An object containing auth token names and values (e.g., { security_token: "jwt_here" })
* @return {Promise<boolean>} A promise that resolves to true on success.
*/
setAuthTokens(authTokens: { [key: string]: string }): Promise<boolean>;

/**
* [Android Only] Bootstrap event listeners for Android. Call this before setting up your own NativeEventEmitter
*
Expand Down Expand Up @@ -332,6 +347,7 @@ const Intercom: IntercomType = {
setLogLevel: (logLevel) => IntercomModule.setLogLevel(logLevel),
setThemeMode: (themeMode) => IntercomModule.setThemeMode(themeMode),
setUserJwt: (jwt) => IntercomModule.setUserJwt(jwt),
setAuthTokens: (authTokens) => IntercomModule.setAuthTokens(authTokens),

bootstrapEventListeners: () => {
if (Platform.OS === 'android' && IntercomEventEmitter?.startEventListener) {
Expand Down