UNPKG

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