Skip to content

Commit a8d8e77

Browse files
authored
Merge pull request #398 from Iterable/MOB-4695-Authhandler-support-for-success-and-failure-callbacks
Mob 4695 authhandler support for success and failure callbacks
2 parents 27bec52 + 2b0c803 commit a8d8e77

4 files changed

Lines changed: 75 additions & 9 deletions

File tree

android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -592,12 +592,13 @@ public String onAuthTokenRequested() {
592592
public void onTokenRegistrationSuccessful(String authToken) {
593593
IterableLogger.v(TAG, "authToken successfully set");
594594
//TODO: Pass successhandler to event listener
595+
sendEvent(EventName.handleAuthSuccessCalled.name(), null);
595596
}
596597

597598
@Override
598599
public void onTokenRegistrationFailed(Throwable object) {
599600
IterableLogger.v(TAG, "Failed to set authToken");
600-
//TODO: Pass failureObject to event listener
601+
sendEvent(EventName.handleAuthFailureCalled.name(), null);
601602
}
602603

603604
@ReactMethod
@@ -643,5 +644,7 @@ enum EventName {
643644
handleCustomActionCalled,
644645
handleInAppCalled,
645646
handleAuthCalled,
646-
receivedIterableInboxChanged
647+
receivedIterableInboxChanged,
648+
handleAuthSuccessCalled,
649+
handleAuthFailureCalled
647650
}

ios/RNIterableAPI/ReactIterableAPI.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class ReactIterableAPI: RCTEventEmitter {
3333
case handleInAppCalled
3434
case handleAuthCalled
3535
case receivedIterableInboxChanged
36+
case handleAuthSuccessCalled
37+
case handleAuthFailureCalled
3638
}
3739

3840
override func supportedEvents() -> [String]! {
@@ -662,12 +664,18 @@ extension ReactIterableAPI: IterableAuthDelegate {
662664
DispatchQueue.main.async {
663665
completion(self.passedAuthToken)
664666
}
667+
668+
self.sendEvent(withName: EventName.handleAuthSuccessCalled.rawValue,
669+
body: nil)
665670
} else {
666671
ITBInfo("authTokenRetrieval timed out")
667672

668673
DispatchQueue.main.async {
669674
completion(nil)
670675
}
676+
677+
self.sendEvent(withName: EventName.handleAuthFailureCalled.rawValue,
678+
body: nil)
671679
}
672680
}
673681
}

ts/Iterable.ts

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515

1616
import IterableInAppManager from './IterableInAppManager'
1717
import IterableInAppMessage from './IterableInAppMessage'
18-
import IterableConfig from './IterableConfig'
18+
import IterableConfig, { AuthResponse } from './IterableConfig'
1919
import { IterableLogger } from './IterableLogger'
2020

2121
const RNIterableAPI = NativeModules.RNIterableAPI
@@ -30,6 +30,11 @@ enum IterableActionSource {
3030
inApp = 2
3131
}
3232

33+
enum AuthResponseCallback {
34+
SUCCESS,
35+
FAILURE,
36+
}
37+
3338
/**
3439
* Enum representing what level of logs will Android and iOS project be printing on their consoles respectively.
3540
*/
@@ -118,7 +123,9 @@ enum EventName {
118123
handleCustomActionCalled = "handleCustomActionCalled",
119124
handleInAppCalled = "handleInAppCalled",
120125
handleAuthCalled = "handleAuthCalled",
121-
receivedIterableInboxChanged = "receivedIterableInboxChanged"
126+
receivedIterableInboxChanged = "receivedIterableInboxChanged",
127+
handleAuthSuccessCalled = "handleAuthSuccessCalled",
128+
handleAuthFailureCalled = "handleAuthFailureCalled"
122129
}
123130

124131
class Iterable {
@@ -634,13 +641,52 @@ class Iterable {
634641
}
635642

636643
if (Iterable.savedConfig.authHandler) {
644+
var authResponseCallback: AuthResponseCallback
637645
RNEventEmitter.addListener(
638646
EventName.handleAuthCalled,
639647
() => {
640648
Iterable.savedConfig.authHandler!()
641-
.then(authToken => {
642-
RNIterableAPI.passAlongAuthToken(authToken)
643-
})
649+
.then(promiseResult => {
650+
// Promise result can be either just String OR of type AuthResponse.
651+
// If type AuthReponse, authToken will be parsed looking for `authToken` within promised object. Two additional listeners will be registered for success and failure callbacks sent by native bridge layer.
652+
// Else it will be looked for as a String.
653+
if(typeof promiseResult === typeof (new AuthResponse())) {
654+
655+
RNIterableAPI.passAlongAuthToken((promiseResult as AuthResponse).authToken)
656+
657+
setTimeout(() => {
658+
if(authResponseCallback === AuthResponseCallback.SUCCESS) {
659+
if((promiseResult as AuthResponse).successCallback){
660+
(promiseResult as AuthResponse).successCallback!()
661+
}
662+
} else if(authResponseCallback === AuthResponseCallback.FAILURE) {
663+
if((promiseResult as AuthResponse).failureCallback){
664+
(promiseResult as AuthResponse).failureCallback!()
665+
}
666+
} else {
667+
Iterable.logger.log('No callback received from native layer')
668+
}
669+
}, 1000)
670+
} else if (typeof promiseResult === typeof "") {
671+
//If promise only returns string
672+
RNIterableAPI.passAlongAuthToken((promiseResult as String))
673+
} else {
674+
Iterable.logger.log('Unexpected promise returned. Auth token expects promise of String or AuthResponse type.')
675+
}
676+
}).catch(e => Iterable.logger.log(e))
677+
}
678+
)
679+
680+
RNEventEmitter.addListener(
681+
EventName.handleAuthSuccessCalled,
682+
() => {
683+
authResponseCallback = AuthResponseCallback.SUCCESS
684+
}
685+
)
686+
RNEventEmitter.addListener(
687+
EventName.handleAuthFailureCalled,
688+
() => {
689+
authResponseCallback = AuthResponseCallback.FAILURE
644690
}
645691
)
646692
}

ts/IterableConfig.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import { IterableInAppShowResponse } from './IterableInAppClasses'
1010

1111
import IterableInAppMessage from './IterableInAppMessage'
1212

13+
14+
type AuthCallBack = (() => void)
15+
1316
/**
1417
Iterable Configuration Object. Use this when initializing the API.
1518
*/
@@ -57,8 +60,8 @@ class IterableConfig {
5760
/**
5861
* The handler with which your own calls to your backend containing the auth token happen
5962
*/
60-
authHandler?: () => Promise<string | undefined>
61-
63+
authHandler?:() => Promise<AuthResponse | String | undefined>
64+
6265
/**
6366
* Set the verbosity of Android and iOS project's log system.
6467
* By default, you will be able to see info level logs printed in IDE when running the app.
@@ -106,4 +109,10 @@ class IterableConfig {
106109
}
107110
}
108111

112+
export class AuthResponse {
113+
authToken?: string = ""
114+
successCallback?: AuthCallBack
115+
failureCallback?: AuthCallBack
116+
}
117+
109118
export default IterableConfig

0 commit comments

Comments
 (0)