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
68 changes: 49 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -173,31 +173,61 @@ apply from: file("../../node_modules/@react-native-community/cli-platform-androi
- Create `MainNotificationService.java` inside your app directory(`com.example.app`) with below content:

***Remember to replace `package com.example.app;`, with your app package name***
- Default Notification Behavior (Goes back to the parent default launcher activity when the user taps the notification):

```java
package com.example.app;
```java
package com.example.app;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import com.intercom.reactnative.IntercomModule;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import com.intercom.reactnative.IntercomModule;

public class MainNotificationService extends FirebaseMessagingService {
public class MainNotificationService extends FirebaseMessagingService {

@Override
public void onNewToken(String refreshedToken) {
IntercomModule.sendTokenToIntercom(getApplication(), refreshedToken);
//DO LOGIC HERE
}
@Override
public void onNewToken(String refreshedToken) {
IntercomModule.sendTokenToIntercom(getApplication(), refreshedToken);
//DO LOGIC HERE
}

public void onMessageReceived(RemoteMessage remoteMessage) {
if (IntercomModule.isIntercomPush(remoteMessage)) {
IntercomModule.handleRemotePushMessage(getApplication(), remoteMessage);
} else {
// HANDLE NON-INTERCOM MESSAGE
public void onMessageReceived(RemoteMessage remoteMessage) {
if (IntercomModule.isIntercomPush(remoteMessage)) {
IntercomModule.handleRemotePushMessage(getApplication(), remoteMessage);
} else {
// HANDLE NON-INTERCOM MESSAGE
}
}
}
}
}
```
```

- Custom Stack:

```java
package com.example.app;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import com.intercom.reactnative.IntercomModule;

public class MainNotificationService extends FirebaseMessagingService {

@Override
public void onNewToken(String refreshedToken) {
IntercomModule.sendTokenToIntercom(getApplication(), refreshedToken);
//DO LOGIC HERE
}

public void onMessageReceived(RemoteMessage remoteMessage) {
if (IntercomModule.isIntercomPush(remoteMessage)) {
TaskStackBuilder customStack = TaskStackBuilder.create(getApplication());
customStack.addNextIntent(new Intent(getApplication(), MainActivity.class)); // Replace with your custom activity
IntercomModule.handleRemotePushWithCustomStack(getApplication(), remoteMessage, customStack);
} else {
// HANDLE NON-INTERCOM MESSAGE
}
}
}
```

- Edit `AndroidManifest.xml`. Add below content inside `<application>` below `<activity/>`

Expand Down
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -69,5 +69,5 @@ dependencies {
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+" // From node_modules
implementation "com.google.firebase:firebase-messaging:${safeExtGet('firebaseMessagingVersion', '20.2.+')}"
implementation 'io.intercom.android:intercom-sdk:17.0.3'
implementation 'io.intercom.android:intercom-sdk:17.1.0'
}
83 changes: 50 additions & 33 deletions android/src/main/java/com/intercom/reactnative/IntercomModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import android.app.Activity;
import android.app.Application;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

Expand Down Expand Up @@ -37,6 +38,7 @@
import io.intercom.android.sdk.helpcenter.sections.HelpCenterCollectionContent;
import io.intercom.android.sdk.identity.Registration;
import io.intercom.android.sdk.push.IntercomPushClient;
import android.app.TaskStackBuilder;

@ReactModule(name = IntercomModule.NAME)
public class IntercomModule extends ReactContextBaseJavaModule {
Expand Down Expand Up @@ -65,11 +67,25 @@ public static boolean isIntercomPush(RemoteMessage remoteMessage) {
}
}

public static void handleRemotePushMessage(@NonNull Application application, RemoteMessage
remoteMessage) {
public static void handleRemotePushWithCustomStack(@NonNull Application application, RemoteMessage remoteMessage,
TaskStackBuilder customStack) {
try {
Map message = remoteMessage.getData();
intercomPushClient.handlePush(application, message);
Map<String, String> message = remoteMessage.getData();
intercomPushClient.handlePushWithCustomStack(application, message, customStack);
} catch (Exception err) {
Log.e(NAME, "handlePushWithCustomStack error:");
Log.e(NAME, err.toString());
}
}

public static void handleRemotePushMessage(@NonNull Application application, RemoteMessage remoteMessage) {
try {
TaskStackBuilder customStack = TaskStackBuilder.create(application);
Intent launchIntent = application.getPackageManager().getLaunchIntentForPackage(application.getPackageName());
if (launchIntent != null) {
customStack.addNextIntent(launchIntent);
}
handleRemotePushWithCustomStack(application, remoteMessage, customStack);
} catch (Exception err) {
Log.e(NAME, "handleRemotePushMessage error:");
Log.e(NAME, err.toString());
Expand Down Expand Up @@ -107,8 +123,7 @@ public void sendTokenToIntercom(@NonNull String token, Promise promise) {
Log.e(NAME, "no current activity");
}

} catch (
Exception err) {
} catch (Exception err) {
Log.e(NAME, "sendTokenToIntercom error:");
Log.e(NAME, err.toString());
promise.reject(IntercomErrorCodes.SEND_TOKEN_TO_INTERCOM, err.toString());
Expand All @@ -117,24 +132,25 @@ public void sendTokenToIntercom(@NonNull String token, Promise promise) {

@ReactMethod
public void loginUnidentifiedUser(Promise promise) {
Intercom.client().loginUnidentifiedUser(new IntercomStatusCallback() {
@Override
public void onSuccess() {
promise.resolve(true);
}
Intercom.client().loginUnidentifiedUser(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());
}
});
@Override
public void onFailure(@NonNull IntercomError intercomError) {
Log.e("ERROR", intercomError.getErrorMessage());
promise.reject(String.valueOf(intercomError.getErrorCode()), intercomError.getErrorMessage());
}
});
}

@ReactMethod
public void loginUserWithUserAttributes(ReadableMap params, Promise promise) {
Boolean hasEmail = params.hasKey("email") && IntercomHelpers.getValueAsStringForKey(params, "email").length() > 0;
Boolean hasUserId = params.hasKey("userId") && IntercomHelpers.getValueAsStringForKey(params, "userId").length() > 0;
Boolean hasUserId = params.hasKey("userId")
&& IntercomHelpers.getValueAsStringForKey(params, "userId").length() > 0;
Registration registration = null;
if (hasEmail && hasUserId) {
String email = IntercomHelpers.getValueAsStringForKey(params, "email");
Expand Down Expand Up @@ -181,19 +197,19 @@ public void setUserHash(String userHash, Promise promise) {

@ReactMethod
public void updateUser(ReadableMap params, Promise promise) {
UserAttributes userAttributes = IntercomHelpers.buildUserAttributes(params);
Intercom.client().updateUser(userAttributes, new IntercomStatusCallback() {
@Override
public void onSuccess() {
promise.resolve(true);
}
UserAttributes userAttributes = IntercomHelpers.buildUserAttributes(params);
Intercom.client().updateUser(userAttributes, 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());
}
});
@Override
public void onFailure(@NonNull IntercomError intercomError) {
Log.e("ERROR", intercomError.getErrorMessage());
promise.reject(String.valueOf(intercomError.getErrorCode()), intercomError.getErrorMessage());
}
});
}

@ReactMethod
Expand Down Expand Up @@ -358,7 +374,6 @@ public void presentContent(ReadableMap params, Promise promise) {
}
}


@ReactMethod
public void fetchHelpCenterCollections(Promise promise) {
try {
Expand Down Expand Up @@ -400,7 +415,8 @@ public void fetchHelpCenterCollection(String collectionId, Promise promise) {
CollectionContentRequestCallback collectionContentCallback = new CollectionContentRequestCallback() {
@Override
public void onComplete(@NotNull HelpCenterCollectionContent helpCenterCollectionContent) {
promise.resolve(IntercomHelpCenterHelpers.parseHelpCenterCollectionsContentToReadableMap(helpCenterCollectionContent));
promise.resolve(
IntercomHelpCenterHelpers.parseHelpCenterCollectionsContentToReadableMap(helpCenterCollectionContent));
}

@Override
Expand Down Expand Up @@ -435,7 +451,8 @@ public void searchHelpCenter(String searchTerm, Promise promise) {
SearchRequestCallback collectionContentCallback = new SearchRequestCallback() {
@Override
public void onComplete(@NotNull List<HelpCenterArticleSearchResult> helpCenterArticleSearchResult) {
promise.resolve(IntercomHelpCenterHelpers.parseHelpCenterArticleSearchToReadableArray(helpCenterArticleSearchResult));
promise.resolve(
IntercomHelpCenterHelpers.parseHelpCenterArticleSearchToReadableArray(helpCenterArticleSearchResult));
}

@Override
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@intercom/intercom-react-native",
"version": "8.7.0",
"version": "8.8.0",
"description": "React Native wrapper to bridge our iOS and Android SDK",
"main": "lib/commonjs/index",
"module": "lib/module/index",
Expand Down