Skip to content
Closed
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
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 INITIALIZE_ERROR = "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
18 changes: 18 additions & 0 deletions android/src/main/java/com/intercom/reactnative/IntercomModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -526,6 +526,24 @@ public void setUserJwt(String jwt, Promise promise) {
}
}

@ReactMethod
public void initialize(String apiKey, String appId, Promise promise) {
try {
Activity activity = getCurrentActivity();
if (activity != null) {
Intercom.initialize(activity.getApplication(), apiKey, appId);
promise.resolve(true);
Log.d(NAME, "Intercom initialized with API key and App ID");
} else {
promise.reject(IntercomErrorCodes.INITIALIZE_ERROR, "Activity is null");
}
} catch (Exception err) {
Log.e(NAME, "initialize error:");
Log.e(NAME, err.toString());
promise.reject(IntercomErrorCodes.INITIALIZE_ERROR, 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
15 changes: 15 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 *INITIALIZE_ERROR = @"110";
NSString *SEND_TOKEN_TO_INTERCOM = @"302";
NSString *FETCH_HELP_CENTER_COLLECTIONS = @"901";
NSString *FETCH_HELP_CENTER_COLLECTION = @"902";
Expand All @@ -27,6 +28,20 @@ - (dispatch_queue_t)methodQueue {
return dispatch_get_main_queue();
}

RCT_EXPORT_METHOD(initialize:(NSString *)apiKey
withAppId:(NSString *)appId
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject) {
@try {
[IntercomModule initialize:apiKey withAppId:appId];
resolve(@(YES));
NSLog(@"Intercom initialized with API key and App ID");
} @catch (NSException *exception) {
NSLog(@"initialize error: %@", exception.reason);
reject(INITIALIZE_ERROR, @"Failed to initialize Intercom", nil);
}
}

+ (void)initialize:(nonnull NSString *)apiKey withAppId:(nonnull NSString *)appId {
NSString *version = @"0";

Expand Down
1 change: 1 addition & 0 deletions src/expo-plugins/@types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ export type IntercomPluginProps = {
androidApiKey: string;
appId: string;
intercomRegion?: IntercomRegion;
useManualInit?: boolean;
};
46 changes: 26 additions & 20 deletions src/expo-plugins/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,16 @@ const mainApplication: ConfigPlugin<IntercomPluginProps> = (_config, props) =>
''
);

stringContents = appendContentsInsideDeclarationBlock(
stringContents,
'onCreate',
`IntercomModule.initialize(this, "${props.androidApiKey}", "${
props.appId
}")${config.modResults.language === 'java' ? ';' : ''}\n`
);
// Only auto-initialize if useManualInit is not true
if (!props.useManualInit) {
stringContents = appendContentsInsideDeclarationBlock(
stringContents,
'onCreate',
`IntercomModule.initialize(this, "${props.androidApiKey}", "${
props.appId
}")${config.modResults.language === 'java' ? ';' : ''}\n`
);
}

config.modResults.contents = stringContents;
return config;
Expand Down Expand Up @@ -116,19 +119,22 @@ const appDelegate: ConfigPlugin<IntercomPluginProps> = (_config, props) =>
)
.replace(/\s*IntercomModule\.initialize\((.*), withAppId: (.*)\)/g, '');

stringContents = isSwift
? insertContentsInsideSwiftFunctionBlock(
stringContents,
'application(_:didFinishLaunchingWithOptions:)',
`IntercomModule.initialize("${props.iosApiKey}", withAppId: "${props.appId}")`,
{ position: 'tailBeforeLastReturn' }
)
: insertContentsInsideObjcFunctionBlock(
stringContents,
'application didFinishLaunchingWithOptions:',
`[IntercomModule initialize:@"${props.iosApiKey}" withAppId:@"${props.appId}"];`,
{ position: 'tailBeforeLastReturn' }
);
// Only auto-initialize if useManualInit is not true
if (!props.useManualInit) {
stringContents = isSwift
? insertContentsInsideSwiftFunctionBlock(
stringContents,
'application(_:didFinishLaunchingWithOptions:)',
`IntercomModule.initialize("${props.iosApiKey}", withAppId: "${props.appId}")`,
{ position: 'tailBeforeLastReturn' }
)
: insertContentsInsideObjcFunctionBlock(
stringContents,
'application didFinishLaunchingWithOptions:',
`[IntercomModule initialize:@"${props.iosApiKey}" withAppId:@"${props.appId}"];`,
{ position: 'tailBeforeLastReturn' }
);
}

config.modResults.contents = stringContents;
return config;
Expand Down
11 changes: 11 additions & 0 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,16 @@ export enum Space {
}

export type IntercomType = {
/**
* Initialize Intercom SDK with API key and App ID.
* This allows manual initialization from React Native instead of requiring native code setup.
*
* @param apiKey Your Intercom API key
* @param appId Your Intercom App ID
* @return {Promise<boolean>} A promise that resolves to true if initialization succeeds
*/
initialize: (apiKey: string, appId: string) => Promise<boolean>;

/**
* Login a unidentified user.
* This is a user that doesn't have any identifiable information such as a `userId` or `email`.
Expand Down Expand Up @@ -312,6 +322,7 @@ export type IntercomType = {
};

const Intercom: IntercomType = {
initialize: (apiKey, appId) => IntercomModule.initialize(apiKey, appId),
loginUnidentifiedUser: () => IntercomModule.loginUnidentifiedUser(),
loginUserWithUserAttributes: (userAttributes) =>
IntercomModule.loginUserWithUserAttributes(userAttributes),
Expand Down