Skip to content

Commit f18e1e9

Browse files
committed
use promises instead of callbacks for request and show (iOS)
1 parent 62d90ef commit f18e1e9

File tree

5 files changed

+79
-60
lines changed

5 files changed

+79
-60
lines changed

Example/index.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,16 @@ export default class Example extends Component {
5959
AdMobRewarded.addEventListener('rewardedVideoDidClose',
6060
() => {
6161
console.log('rewardedVideoDidClose');
62-
AdMobRewarded.requestAd((error) => error && console.log(error));
62+
AdMobRewarded.requestAd().catch(error => console.log(error));
6363
}
6464
);
6565
AdMobRewarded.addEventListener('rewardedVideoWillLeaveApplication',
6666
() => console.log('rewardedVideoWillLeaveApplication')
6767
);
6868

69-
AdMobRewarded.requestAd((error) => error && console.log(error));
69+
AdMobRewarded.requestAd().catch(error => console.log(error));
7070

71-
AdMobInterstitial.setTestDevices([AdMobRewarded.simulatorId]);
71+
AdMobInterstitial.setTestDevices([AdMobInterstitial.simulatorId]);
7272
AdMobInterstitial.setAdUnitID('ca-app-pub-3940256099942544/4411468910');
7373

7474
AdMobInterstitial.addEventListener('interstitialDidLoad',
@@ -83,14 +83,14 @@ export default class Example extends Component {
8383
AdMobInterstitial.addEventListener('interstitialDidClose',
8484
() => {
8585
console.log('interstitialDidClose');
86-
AdMobInterstitial.requestAd((error) => error && console.log(error));
86+
AdMobInterstitial.requestAd().catch(error => console.log(error));
8787
}
8888
);
8989
AdMobInterstitial.addEventListener('interstitialWillLeaveApplication',
9090
() => console.log('interstitialWillLeaveApplication')
9191
);
9292

93-
AdMobInterstitial.requestAd((error) => error && console.log(error));
93+
AdMobInterstitial.requestAd().catch(error => console.log(error));
9494
}
9595

9696
componentWillUnmount() {
@@ -99,11 +99,11 @@ export default class Example extends Component {
9999
}
100100

101101
showRewarded() {
102-
AdMobRewarded.showAd((error) => error && console.log(error));
102+
AdMobRewarded.showAd().catch(error => console.log(error));
103103
}
104104

105105
showInterstitial() {
106-
AdMobInterstitial.showAd((error) => error && console.log(error));
106+
AdMobInterstitial.showAd().catch(error => console.log(error));
107107
}
108108

109109
render() {

RNAdMobInterstitial.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,23 @@ const adMobInterstitialEmitter = new NativeEventEmitter(RNAdMobInterstitial);
99

1010
const eventHandlers = {};
1111

12+
const createErrorFromErrorData = (errorData) => {
13+
const {
14+
message,
15+
...extraErrorInfo
16+
} = errorData || {};
17+
const error = new Error(message);
18+
error.framesToPop = 1;
19+
return Object.assign(error, extraErrorInfo);
20+
}
21+
1222
const addEventListener = (type, handler) => {
1323
eventHandlers[type] = eventHandlers[type] || new Map();
14-
eventHandlers[type].set(handler, adMobInterstitialEmitter.addListener(type, handler));
24+
if (type === 'interstitialDidFailToLoad') {
25+
eventHandlers[type].set(handler, adMobInterstitialEmitter.addListener(type, error => handler(createErrorFromErrorData(error))));
26+
} else {
27+
eventHandlers[type].set(handler, adMobInterstitialEmitter.addListener(type, handler));
28+
}
1529
};
1630

1731
const removeEventListener = (type, handler) => {
@@ -34,8 +48,6 @@ const removeAllListeners = () => {
3448

3549
export default {
3650
...RNAdMobInterstitial,
37-
requestAd: (cb = () => {}) => RNAdMobInterstitial.requestAd(cb), // requestAd callback is optional
38-
showAd: (cb = () => {}) => RNAdMobInterstitial.showAd(cb), // showAd callback is optional
3951
addEventListener,
4052
removeEventListener,
4153
removeAllListeners,

RNAdMobRewarded.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,23 @@ const adMobRewardedEmitter = new NativeEventEmitter(RNAdMobRewarded);
1010

1111
const eventHandlers = {};
1212

13+
const createErrorFromErrorData = (errorData) => {
14+
const {
15+
message,
16+
...extraErrorInfo
17+
} = errorData || {};
18+
const error = new Error(message);
19+
error.framesToPop = 1;
20+
return Object.assign(error, extraErrorInfo);
21+
}
22+
1323
const addEventListener = (type, handler) => {
1424
eventHandlers[type] = eventHandlers[type] || new Map();
15-
eventHandlers[type].set(handler, adMobRewardedEmitter.addListener(type, handler));
25+
if (type === 'rewardedVideoDidFailToLoad') {
26+
eventHandlers[type].set(handler, adMobRewardedEmitter.addListener(type, error => handler(createErrorFromErrorData(error))));
27+
} else {
28+
eventHandlers[type].set(handler, adMobRewardedEmitter.addListener(type, handler));
29+
}
1630
};
1731

1832
const removeEventListener = (type, handler) => {
@@ -35,8 +49,6 @@ const removeAllListeners = () => {
3549

3650
export default {
3751
...RNAdMobRewarded,
38-
requestAd: (cb = () => {}) => RNAdMobRewarded.requestAd(cb), // requestAd callback is optional
39-
showAd: (cb = () => {}) => RNAdMobRewarded.showAd(cb), // showAd callback is optional
4052
addEventListener,
4153
removeEventListener,
4254
removeAllListeners,

ios/RNAdMobInterstitial.m

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ @implementation RNAdMobInterstitial {
1010
GADInterstitial *_interstitial;
1111
NSString *_adUnitID;
1212
NSArray *_testDevices;
13-
RCTResponseSenderBlock _requestAdCallback;
14-
RCTResponseSenderBlock _showAdCallback;
13+
RCTPromiseResolveBlock _requestAdResolve;
14+
RCTPromiseRejectBlock _requestAdReject;
1515
BOOL hasListeners;
1616
}
1717

@@ -44,32 +44,34 @@ - (dispatch_queue_t)methodQueue
4444
_testDevices = testDevices;
4545
}
4646

47-
RCT_EXPORT_METHOD(requestAd:(RCTResponseSenderBlock)callback)
47+
RCT_EXPORT_METHOD(requestAd:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
4848
{
49+
_requestAdResolve = nil;
50+
_requestAdReject = nil;
51+
4952
if ([_interstitial hasBeenUsed] || _interstitial == nil) {
50-
_requestAdCallback = callback;
53+
_requestAdResolve = resolve;
54+
_requestAdReject = reject;
5155

5256
_interstitial = [[GADInterstitial alloc] initWithAdUnitID:_adUnitID];
53-
if (hasListeners) {
54-
_interstitial.delegate = self;
55-
}
57+
_interstitial.delegate = self;
5658

5759
GADRequest *request = [GADRequest request];
5860
request.testDevices = _testDevices;
5961
[_interstitial loadRequest:request];
6062
} else {
61-
callback(@[RCTMakeError(@"Ad is already loaded.", nil, nil)]);
63+
reject(@"E_AD_ALREADY_LOADED", @"Ad is already loaded.", nil);
6264
}
6365
}
6466

65-
RCT_EXPORT_METHOD(showAd:(RCTResponseSenderBlock)callback)
67+
RCT_EXPORT_METHOD(showAd:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
6668
{
6769
if ([_interstitial isReady]) {
68-
_showAdCallback = callback;
6970
[_interstitial presentFromRootViewController:[UIApplication sharedApplication].delegate.window.rootViewController];
71+
resolve(nil);
7072
}
7173
else {
72-
callback(@[RCTMakeError(@"Ad is not ready.", nil, nil)]);
74+
reject(@"E_AD_NOT_READY", @"Ad is not ready.", nil);
7375
}
7476
}
7577

@@ -88,50 +90,43 @@ - (dispatch_queue_t)methodQueue
8890
- (void)startObserving
8991
{
9092
hasListeners = YES;
91-
if (_interstitial) {
92-
_interstitial.delegate = self;
93-
}
9493
}
9594

9695
- (void)stopObserving
9796
{
9897
hasListeners = NO;
99-
if (_interstitial) {
100-
_interstitial.delegate = nil;
101-
}
10298
}
10399

104100
#pragma mark GADInterstitialDelegate
105101

106-
- (void)interstitialDidReceiveAd:(GADInterstitial *)ad {
102+
- (void)interstitialDidReceiveAd:(__unused GADInterstitial *)ad {
107103
if (hasListeners) {
108104
[self sendEventWithName:@"interstitialDidLoad" body:nil];
109105
}
110-
_requestAdCallback(@[[NSNull null]]);
106+
_requestAdResolve(nil);
111107
}
112108

113-
- (void)interstitial:(GADInterstitial *)interstitial
114-
didFailToReceiveAdWithError:(GADRequestError *)error {
109+
- (void)interstitial:(__unused GADInterstitial *)interstitial didFailToReceiveAdWithError:(GADRequestError *)error {
115110
if (hasListeners) {
116-
[self sendEventWithName:@"interstitialDidFailToLoad" body:@{@"name": [error description]}];
111+
NSDictionary *jsError = RCTJSErrorFromCodeMessageAndNSError(@"E_AD_REQUEST_FAILED", error.localizedDescription, error);
112+
[self sendEventWithName:@"interstitialDidFailToLoad" body:jsError];
117113
}
118-
_requestAdCallback(@[[error description]]);
114+
_requestAdReject(@"E_AD_REQUEST_FAILED", error.localizedDescription, error);
119115
}
120116

121-
- (void)interstitialWillPresentScreen:(GADInterstitial *)ad {
117+
- (void)interstitialWillPresentScreen:(__unused GADInterstitial *)ad {
122118
if (hasListeners){
123119
[self sendEventWithName:@"interstitialDidOpen" body:nil];
124120
}
125-
_showAdCallback(@[[NSNull null]]);
126121
}
127122

128-
- (void)interstitialDidDismissScreen:(GADInterstitial *)ad {
123+
- (void)interstitialDidDismissScreen:(__unused GADInterstitial *)ad {
129124
if (hasListeners) {
130125
[self sendEventWithName:@"interstitialDidClose" body:nil];
131126
}
132127
}
133128

134-
- (void)interstitialWillLeaveApplication:(GADInterstitial *)ad {
129+
- (void)interstitialWillLeaveApplication:(__unused GADInterstitial *)ad {
135130
if (hasListeners) {
136131
[self sendEventWithName:@"interstitialWillLeaveApplication" body:nil];
137132
}

ios/RNAdMobRewarded.m

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
@implementation RNAdMobRewarded {
1010
NSString *_adUnitID;
1111
NSArray *_testDevices;
12-
RCTResponseSenderBlock _requestAdCallback;
13-
RCTResponseSenderBlock _showAdCallback;
12+
RCTPromiseResolveBlock _requestAdResolve;
13+
RCTPromiseRejectBlock _requestAdReject;
1414
BOOL hasListeners;
1515
}
1616

@@ -45,26 +45,28 @@ - (dispatch_queue_t)methodQueue
4545
_testDevices = testDevices;
4646
}
4747

48-
RCT_EXPORT_METHOD(requestAd:(RCTResponseSenderBlock)callback)
48+
RCT_EXPORT_METHOD(requestAd:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
4949
{
50-
_requestAdCallback = callback;
50+
_requestAdResolve = resolve;
51+
_requestAdReject = reject;
52+
5153
[GADRewardBasedVideoAd sharedInstance].delegate = self;
5254
GADRequest *request = [GADRequest request];
5355
request.testDevices = _testDevices;
5456
[[GADRewardBasedVideoAd sharedInstance] loadRequest:request
5557
withAdUnitID:_adUnitID];
5658
}
5759

58-
RCT_EXPORT_METHOD(showAd:(RCTResponseSenderBlock)callback)
60+
RCT_EXPORT_METHOD(showAd:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
5961
{
6062
if ([[GADRewardBasedVideoAd sharedInstance] isReady]) {
61-
_showAdCallback = callback;
6263
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
6364
UIViewController *rootViewController = [keyWindow rootViewController];
6465
[[GADRewardBasedVideoAd sharedInstance] presentFromRootViewController:rootViewController];
66+
resolve(nil);
6567
}
6668
else {
67-
callback(@[RCTMakeError(@"Ad is not ready", nil, nil)]);
69+
reject(@"E_AD_NOT_READY", @"Ad is not ready.", nil);
6870
}
6971
}
7072

@@ -83,62 +85,60 @@ - (dispatch_queue_t)methodQueue
8385
- (void)startObserving
8486
{
8587
hasListeners = YES;
86-
[GADRewardBasedVideoAd sharedInstance].delegate = self;
8788
}
8889

8990
- (void)stopObserving
9091
{
9192
hasListeners = NO;
92-
[GADRewardBasedVideoAd sharedInstance].delegate = nil;
9393
}
9494

9595
#pragma mark GADRewardBasedVideoAdDelegate
9696

97-
- (void)rewardBasedVideoAd:(GADRewardBasedVideoAd *)rewardBasedVideoAd
97+
- (void)rewardBasedVideoAd:(__unused GADRewardBasedVideoAd *)rewardBasedVideoAd
9898
didRewardUserWithReward:(GADAdReward *)reward {
9999
if (hasListeners) {
100100
[self sendEventWithName:@"rewardedVideoDidRewardUser" body:@{@"type": reward.type, @"amount": reward.amount}];
101101
}
102102
}
103103

104-
- (void)rewardBasedVideoAdDidReceiveAd:(GADRewardBasedVideoAd *)rewardBasedVideoAd {
104+
- (void)rewardBasedVideoAdDidReceiveAd:(__unused GADRewardBasedVideoAd *)rewardBasedVideoAd {
105105
if (hasListeners) {
106106
[self sendEventWithName:@"rewardedVideoDidLoad" body:nil];
107107
}
108-
_requestAdCallback(@[[NSNull null]]);
108+
_requestAdResolve(nil);
109109
}
110110

111-
- (void)rewardBasedVideoAdDidOpen:(GADRewardBasedVideoAd *)rewardBasedVideoAd {
111+
- (void)rewardBasedVideoAdDidOpen:(__unused GADRewardBasedVideoAd *)rewardBasedVideoAd {
112112
if (hasListeners) {
113113
[self sendEventWithName:@"rewardedVideoDidOpen" body:nil];
114114
}
115-
_showAdCallback(@[[NSNull null]]);
116115
}
117116

118-
- (void)rewardBasedVideoAdDidStartPlaying:(GADRewardBasedVideoAd *)rewardBasedVideoAd {
117+
- (void)rewardBasedVideoAdDidStartPlaying:(__unused GADRewardBasedVideoAd *)rewardBasedVideoAd {
119118
if (hasListeners) {
120119
[self sendEventWithName:@"rewardedVideoDidStartPlaying" body:nil];
121120
}
122121
}
123122

124-
- (void)rewardBasedVideoAdDidClose:(GADRewardBasedVideoAd *)rewardBasedVideoAd {
123+
- (void)rewardBasedVideoAdDidClose:(__unused GADRewardBasedVideoAd *)rewardBasedVideoAd {
125124
if (hasListeners) {
126125
[self sendEventWithName:@"rewardedVideoDidClose" body:nil];
127126
}
128127
}
129128

130-
- (void)rewardBasedVideoAdWillLeaveApplication:(GADRewardBasedVideoAd *)rewardBasedVideoAd {
129+
- (void)rewardBasedVideoAdWillLeaveApplication:(__unused GADRewardBasedVideoAd *)rewardBasedVideoAd {
131130
if (hasListeners) {
132131
[self sendEventWithName:@"rewardedVideoWillLeaveApplication" body:nil];
133132
}
134133
}
135134

136-
- (void)rewardBasedVideoAd:(GADRewardBasedVideoAd *)rewardBasedVideoAd
135+
- (void)rewardBasedVideoAd:(__unused GADRewardBasedVideoAd *)rewardBasedVideoAd
137136
didFailToLoadWithError:(NSError *)error {
138137
if (hasListeners) {
139-
[self sendEventWithName:@"rewardedVideoDidFailToLoad" body:@{@"name": [error description]}];
138+
NSDictionary *jsError = RCTJSErrorFromCodeMessageAndNSError(@"E_AD_REQUEST_FAILED", error.localizedDescription, error);
139+
[self sendEventWithName:@"rewardedVideoDidFailToLoad" body:jsError];
140140
}
141-
_requestAdCallback(@[RCTJSErrorFromNSError(error)]);
141+
_requestAdReject(@"E_AD_REQUEST_FAILED", error.localizedDescription, error);
142142
}
143143

144144
@end

0 commit comments

Comments
 (0)