UNPKG

3.38 kBPlain TextView Raw
1import { EventEmitter, Subscription, UnavailabilityError } from '@unimodules/core';
2
3import { setTestDeviceIDAsync } from './AdMob';
4import AdMobNativeModule from './ExpoAdsAdMobRewardedVideoAdManager';
5
6const moduleName = 'AdMobRewarded';
7
8const eventNames = [
9 'rewardedVideoDidRewardUser',
10 'rewardedVideoDidLoad',
11 'rewardedVideoDidFailToLoad',
12 'rewardedVideoDidOpen',
13 'rewardedVideoDidStart',
14 'rewardedVideoDidClose',
15 'rewardedVideoWillLeaveApplication',
16];
17
18type EventNameType =
19 | 'rewardedVideoDidRewardUser'
20 | 'rewardedVideoDidLoad'
21 | 'rewardedVideoDidFailToLoad'
22 | 'rewardedVideoDidOpen'
23 | 'rewardedVideoDidStart'
24 | 'rewardedVideoDidClose'
25 | 'rewardedVideoWillLeaveApplication';
26
27const eventEmitter = new EventEmitter(AdMobNativeModule);
28
29type EventListener = (...args: any[]) => void;
30
31const eventHandlers: { [eventName: string]: Map<EventListener, Subscription> } = {};
32
33for (const eventName of eventNames) {
34 eventHandlers[eventName] = new Map();
35}
36
37export default {
38 async setAdUnitID(id: string): Promise<void> {
39 if (!AdMobNativeModule.setAdUnitID) {
40 throw new UnavailabilityError(moduleName, 'setAdUnitID');
41 }
42
43 await AdMobNativeModule.setAdUnitID(id);
44 },
45
46 /** @deprecated Test device IDs are now set globally. Use `AdMob.setTestDeviceIDAsync` instead. */
47 async setTestDeviceID(id: string): Promise<void> {
48 console.warn(
49 'AdMobRewarded.setTestDeviceID is deprecated. Test device IDs are now set globally. Use AdMob.setTestDeviceIDAsync instead.'
50 );
51 await setTestDeviceIDAsync(id);
52 },
53 async requestAdAsync(
54 options: {
55 servePersonalizedAds?: boolean;
56 additionalRequestParams?: { [key: string]: string };
57 } = {}
58 ): Promise<void> {
59 if (!AdMobNativeModule.requestAd) {
60 throw new UnavailabilityError(moduleName, 'requestAdAsync');
61 }
62
63 const params: { [key: string]: string } = {
64 ...options.additionalRequestParams,
65 };
66 if (!options.servePersonalizedAds) {
67 params.npa = '1';
68 }
69
70 await AdMobNativeModule.requestAd(params);
71 },
72 async showAdAsync(): Promise<void> {
73 if (!AdMobNativeModule.showAd) {
74 throw new UnavailabilityError(moduleName, 'showAdAsync');
75 }
76
77 await AdMobNativeModule.showAd();
78 },
79 async dismissAdAsync(): Promise<void> {
80 if (!AdMobNativeModule.dismissAd) {
81 throw new UnavailabilityError(moduleName, 'dismissAdAsync');
82 }
83
84 await AdMobNativeModule.dismissAd();
85 },
86 async getIsReadyAsync(): Promise<boolean> {
87 if (!AdMobNativeModule.getIsReady) {
88 throw new UnavailabilityError(moduleName, 'getIsReadyAsync');
89 }
90
91 return await AdMobNativeModule.getIsReady();
92 },
93 addEventListener(type: EventNameType, handler: EventListener) {
94 if (eventNames.includes(type)) {
95 eventHandlers[type].set(handler, eventEmitter.addListener(type, handler));
96 } else {
97 console.log(`Event with type ${type} does not exist.`);
98 }
99 },
100 removeEventListener(type: EventNameType, handler: EventListener) {
101 const eventSubscription = eventHandlers[type].get(handler);
102 if (!eventHandlers[type].has(handler) || !eventSubscription) {
103 return;
104 }
105 eventSubscription.remove();
106 eventHandlers[type].delete(handler);
107 },
108 removeAllListeners() {
109 for (const eventName of eventNames) {
110 eventEmitter.removeAllListeners(eventName);
111 }
112 },
113};