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 @@ -681,6 +681,21 @@ public void onTokenRegistrationSuccessful(String authToken) {
sendEvent(EventName.handleAuthSuccessCalled.name(), null);
}

@Override
public void onTokenRegistrationFailed(String reason) {
IterableLogger.e(TAG, "Token registration failed: " + reason);
JSONObject messageJson = new JSONObject();
try {
if (reason != null) {
messageJson.put("reason", reason);
}
WritableMap eventData = Serialization.convertJsonToMap(messageJson);
sendEvent(EventName.handleTokenRegistrationFailedCalled.name(), eventData);
} catch (JSONException e) {
IterableLogger.e(TAG, "Failed to send token registration failure event");
}
}

public void addListener(String eventName) {
// Keep: Required for RN built in Event Emitter Calls.
}
Expand Down Expand Up @@ -811,5 +826,6 @@ enum EventName {
handleInAppCalled,
handleUrlCalled,
receivedIterableEmbeddedMessagesChanged,
receivedIterableInboxChanged
receivedIterableInboxChanged,
handleTokenRegistrationFailedCalled
}
12 changes: 12 additions & 0 deletions ios/RNIterableAPI/ReactIterableAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import React
case handleAuthFailureCalled
case handleEmbeddedMessageUpdateCalled
case handleEmbeddedMessagingDisabledCalled
case handleTokenRegistrationFailedCalled
}

@objc public static var supportedEvents: [String] {
Expand Down Expand Up @@ -818,6 +819,17 @@ extension ReactIterableAPI: IterableAuthDelegate {
}

public func onTokenRegistrationFailed(_ reason: String?) {
ITBInfo()
guard shouldEmit else {
return
}
var body: [String: Any] = [:]
if let reason = reason {
body["reason"] = reason
}
delegate?.sendEvent(
withName: EventName.handleTokenRegistrationFailedCalled.rawValue,
body: body)
}
}

Expand Down
3 changes: 3 additions & 0 deletions src/core/classes/Iterable.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ describe('Iterable', () => {
nativeEmitter.removeAllListeners(
IterableEventName.handleEmbeddedMessagingDisabledCalled
);
nativeEmitter.removeAllListeners(
IterableEventName.handleTokenRegistrationFailedCalled
);

// Clear any pending timers
jest.clearAllTimers();
Expand Down
12 changes: 12 additions & 0 deletions src/core/classes/Iterable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -956,6 +956,9 @@ export class Iterable {
RNEventEmitter.removeAllListeners(
IterableEventName.handleEmbeddedMessagingDisabledCalled
);
RNEventEmitter.removeAllListeners(
IterableEventName.handleTokenRegistrationFailedCalled
);
}

/**
Expand Down Expand Up @@ -1090,6 +1093,15 @@ export class Iterable {
);
}

if (Iterable.savedConfig.onTokenRegistrationFailed) {
RNEventEmitter.addListener(
IterableEventName.handleTokenRegistrationFailedCalled,
(dict: { reason?: string } | null) => {
Iterable.savedConfig.onTokenRegistrationFailed?.(dict?.reason);
}
);
}

if (Iterable.savedConfig.enableEmbeddedMessaging) {
if (Iterable.savedConfig.onEmbeddedMessageUpdate) {
RNEventEmitter.addListener(
Expand Down
28 changes: 28 additions & 0 deletions src/core/classes/IterableConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,32 @@ export class IterableConfig {
*/
onEmbeddedMessageUpdate?: () => void;

/**
* A callback function that is called when device token registration fails
* during automatic push registration.
*
* When `autoPushRegistration` is enabled (the default), calling `setEmail`
* or `setUserId` triggers an automatic device token registration with Iterable's
* servers. If this registration fails (e.g., due to an invalid `pushIntegrationName`),
* this callback will be invoked with the failure reason.
*
* Without this callback, push registration failures are silent and can only
* be detected by inspecting network traffic.
*
* @param reason - A string describing why the token registration failed,
* or undefined if the reason is unknown.
*
* @example
* ```typescript
* const config = new IterableConfig();
* config.onTokenRegistrationFailed = (reason) => {
* console.error('Push token registration failed:', reason);
* };
* Iterable.initialize('<YOUR_API_KEY>', config);
* ```
*/
onTokenRegistrationFailed?: (reason?: string) => void;

/**
* A callback function that is called when embedded messaging is disabled.
*
Expand Down Expand Up @@ -428,6 +454,8 @@ export class IterableConfig {
// eslint-disable-next-line eqeqeq
onEmbeddedMessagingDisabledPresent:
this.onEmbeddedMessagingDisabled != undefined,
onTokenRegistrationFailedPresent:
this.onTokenRegistrationFailed !== undefined,
/** The log level for the SDK. */
logLevel: this.logLevel,
expiringAuthTokenRefreshPeriod: this.expiringAuthTokenRefreshPeriod,
Expand Down
2 changes: 2 additions & 0 deletions src/core/enums/IterableEventName.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,6 @@ export enum IterableEventName {
handleEmbeddedMessageUpdateCalled = 'handleEmbeddedMessageUpdateCalled',
/** Event that fires when embedded messaging is disabled */
handleEmbeddedMessagingDisabledCalled = 'handleEmbeddedMessagingDisabledCalled',
/** Event that fires when device token registration fails */
handleTokenRegistrationFailedCalled = 'handleTokenRegistrationFailedCalled',
}
Loading