react-native-pangleads 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/LICENSE +20 -0
  2. package/NitroPangleAds.podspec +26 -0
  3. package/README.md +80 -0
  4. package/android/CMakeLists.txt +20 -0
  5. package/android/build.gradle +129 -0
  6. package/android/consumer-rules.pro +2 -0
  7. package/android/fix-prefab.gradle +46 -0
  8. package/android/gradle.properties +5 -0
  9. package/android/src/main/AndroidManifest.xml +1 -0
  10. package/android/src/main/cpp/cpp-adapter.cpp +7 -0
  11. package/android/src/main/java/com/margelo/nitro/pangleads/HybridPangleAds.kt +123 -0
  12. package/android/src/main/java/com/margelo/nitro/pangleads/HybridPangleInterstitialAd.kt +106 -0
  13. package/android/src/main/java/com/margelo/nitro/pangleads/HybridPangleRewardedAd.kt +139 -0
  14. package/android/src/main/java/com/margelo/nitro/pangleads/NitroPangleAdsPackage.java +27 -0
  15. package/android/src/main/java/com/margelo/nitro/pangleads/PangleAdEventEmitter.kt +41 -0
  16. package/android/src/main/java/com/margelo/nitro/pangleads/PangleAndroidUtils.kt +32 -0
  17. package/ios/HybridPangleAds.swift +120 -0
  18. package/ios/HybridPangleInterstitialAd.swift +110 -0
  19. package/ios/HybridPangleRewardedAd.swift +143 -0
  20. package/ios/PangleSupport.swift +129 -0
  21. package/lib/module/index.js +172 -0
  22. package/lib/module/index.js.map +1 -0
  23. package/lib/module/index.test.js +201 -0
  24. package/lib/module/index.test.js.map +1 -0
  25. package/lib/module/package.json +1 -0
  26. package/lib/module/specs/PangleAds.nitro.js +4 -0
  27. package/lib/module/specs/PangleAds.nitro.js.map +1 -0
  28. package/lib/typescript/package.json +1 -0
  29. package/lib/typescript/src/index.d.ts +68 -0
  30. package/lib/typescript/src/index.d.ts.map +1 -0
  31. package/lib/typescript/src/index.test.d.ts +2 -0
  32. package/lib/typescript/src/index.test.d.ts.map +1 -0
  33. package/lib/typescript/src/specs/PangleAds.nitro.d.ts +46 -0
  34. package/lib/typescript/src/specs/PangleAds.nitro.d.ts.map +1 -0
  35. package/nitro.json +18 -0
  36. package/nitrogen/generated/android/NitroPangleAds+autolinking.cmake +85 -0
  37. package/nitrogen/generated/android/NitroPangleAds+autolinking.gradle +27 -0
  38. package/nitrogen/generated/android/NitroPangleAdsOnLoad.cpp +50 -0
  39. package/nitrogen/generated/android/NitroPangleAdsOnLoad.hpp +25 -0
  40. package/nitrogen/generated/android/c++/JFunc_void_std__optional_PangleAdEventPayload_.hpp +78 -0
  41. package/nitrogen/generated/android/c++/JHybridPangleAdsSpec.cpp +88 -0
  42. package/nitrogen/generated/android/c++/JHybridPangleAdsSpec.hpp +69 -0
  43. package/nitrogen/generated/android/c++/JHybridPangleInterstitialAdSpec.cpp +85 -0
  44. package/nitrogen/generated/android/c++/JHybridPangleInterstitialAdSpec.hpp +68 -0
  45. package/nitrogen/generated/android/c++/JHybridPangleRewardedAdSpec.cpp +89 -0
  46. package/nitrogen/generated/android/c++/JHybridPangleRewardedAdSpec.hpp +68 -0
  47. package/nitrogen/generated/android/c++/JPangleAdEventPayload.hpp +58 -0
  48. package/nitrogen/generated/android/c++/JPangleAdEventType.hpp +74 -0
  49. package/nitrogen/generated/android/c++/JPangleAdVerificationOptions.hpp +58 -0
  50. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pangleads/Func_void_std__optional_PangleAdEventPayload_.kt +81 -0
  51. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pangleads/HybridPangleAdsSpec.kt +72 -0
  52. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pangleads/HybridPangleInterstitialAdSpec.kt +73 -0
  53. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pangleads/HybridPangleRewardedAdSpec.kt +73 -0
  54. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pangleads/NitroPangleAdsOnLoad.kt +35 -0
  55. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pangleads/PangleAdEventPayload.kt +32 -0
  56. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pangleads/PangleAdEventType.kt +26 -0
  57. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pangleads/PangleAdVerificationOptions.kt +32 -0
  58. package/nitrogen/generated/ios/NitroPangleAds+autolinking.rb +60 -0
  59. package/nitrogen/generated/ios/NitroPangleAds-Swift-Cxx-Bridge.cpp +90 -0
  60. package/nitrogen/generated/ios/NitroPangleAds-Swift-Cxx-Bridge.hpp +270 -0
  61. package/nitrogen/generated/ios/NitroPangleAds-Swift-Cxx-Umbrella.hpp +66 -0
  62. package/nitrogen/generated/ios/NitroPangleAdsAutolinking.mm +33 -0
  63. package/nitrogen/generated/ios/NitroPangleAdsAutolinking.swift +25 -0
  64. package/nitrogen/generated/ios/c++/HybridPangleAdsSpecSwift.cpp +11 -0
  65. package/nitrogen/generated/ios/c++/HybridPangleAdsSpecSwift.hpp +114 -0
  66. package/nitrogen/generated/ios/c++/HybridPangleInterstitialAdSpecSwift.cpp +11 -0
  67. package/nitrogen/generated/ios/c++/HybridPangleInterstitialAdSpecSwift.hpp +107 -0
  68. package/nitrogen/generated/ios/c++/HybridPangleRewardedAdSpecSwift.cpp +11 -0
  69. package/nitrogen/generated/ios/c++/HybridPangleRewardedAdSpecSwift.hpp +110 -0
  70. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  71. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  72. package/nitrogen/generated/ios/swift/Func_void_std__optional_PangleAdEventPayload_.swift +54 -0
  73. package/nitrogen/generated/ios/swift/HybridPangleAdsSpec.swift +54 -0
  74. package/nitrogen/generated/ios/swift/HybridPangleAdsSpec_cxx.swift +193 -0
  75. package/nitrogen/generated/ios/swift/HybridPangleInterstitialAdSpec.swift +53 -0
  76. package/nitrogen/generated/ios/swift/HybridPangleInterstitialAdSpec_cxx.swift +186 -0
  77. package/nitrogen/generated/ios/swift/HybridPangleRewardedAdSpec.swift +53 -0
  78. package/nitrogen/generated/ios/swift/HybridPangleRewardedAdSpec_cxx.swift +193 -0
  79. package/nitrogen/generated/ios/swift/PangleAdEventPayload.swift +77 -0
  80. package/nitrogen/generated/ios/swift/PangleAdEventType.swift +60 -0
  81. package/nitrogen/generated/ios/swift/PangleAdVerificationOptions.swift +84 -0
  82. package/nitrogen/generated/shared/c++/HybridPangleAdsSpec.cpp +26 -0
  83. package/nitrogen/generated/shared/c++/HybridPangleAdsSpec.hpp +74 -0
  84. package/nitrogen/generated/shared/c++/HybridPangleInterstitialAdSpec.cpp +25 -0
  85. package/nitrogen/generated/shared/c++/HybridPangleInterstitialAdSpec.hpp +73 -0
  86. package/nitrogen/generated/shared/c++/HybridPangleRewardedAdSpec.cpp +25 -0
  87. package/nitrogen/generated/shared/c++/HybridPangleRewardedAdSpec.hpp +76 -0
  88. package/nitrogen/generated/shared/c++/PangleAdEventPayload.hpp +72 -0
  89. package/nitrogen/generated/shared/c++/PangleAdEventType.hpp +96 -0
  90. package/nitrogen/generated/shared/c++/PangleAdVerificationOptions.hpp +72 -0
  91. package/package.json +177 -0
  92. package/react-native.config.js +8 -0
  93. package/src/index.test.ts +255 -0
  94. package/src/index.ts +305 -0
  95. package/src/specs/PangleAds.nitro.ts +66 -0
package/src/index.ts ADDED
@@ -0,0 +1,305 @@
1
+ import { NitroModules } from 'react-native-nitro-modules';
2
+
3
+ import type {
4
+ PangleAdEventPayload,
5
+ PangleAdVerificationOptions,
6
+ PangleAds,
7
+ PangleInterstitialAd,
8
+ PangleRewardedAd,
9
+ } from './specs/PangleAds.nitro';
10
+
11
+ export enum AdEventType {
12
+ LOADED = 'loaded',
13
+ ERROR = 'error',
14
+ OPENED = 'opened',
15
+ CLICKED = 'clicked',
16
+ CLOSED = 'closed',
17
+ }
18
+
19
+ export enum RewardedAdEventType {
20
+ LOADED = 'rewarded_loaded',
21
+ EARNED_REWARD = 'rewarded_earned_reward',
22
+ }
23
+
24
+ export type AdapterStatus = {
25
+ name: string;
26
+ description: string;
27
+ state: InitializationState;
28
+ };
29
+
30
+ export enum InitializationState {
31
+ AdapterInitializationStateNotReady = 0,
32
+ AdapterInitializationStateReady = 1,
33
+ }
34
+
35
+ type PublicAdEventType = AdEventType | RewardedAdEventType;
36
+
37
+ export type AdEventPayload<T extends PublicAdEventType> =
38
+ T extends AdEventType.ERROR ? Error : undefined;
39
+
40
+ export type AdEventListener<T extends PublicAdEventType> = (
41
+ payload: AdEventPayload<T>
42
+ ) => void;
43
+
44
+ export type AdEventsListener<T extends PublicAdEventType> = (event: {
45
+ type: T;
46
+ payload: AdEventPayload<T>;
47
+ }) => void;
48
+
49
+ const nativeAds = NitroModules.createHybridObject<PangleAds>('PangleAds');
50
+
51
+ function toPublicPayload(
52
+ eventType: PublicAdEventType,
53
+ payload?: PangleAdEventPayload
54
+ ): Error | undefined {
55
+ if (eventType === AdEventType.ERROR) {
56
+ const error = new Error(
57
+ payload?.errorMessage ?? 'Unknown Pangle Ads error'
58
+ );
59
+ error.name = 'PangleAdsError';
60
+ Object.assign(error, { code: String(payload?.errorCode ?? 'unknown') });
61
+ return error;
62
+ }
63
+
64
+ return undefined;
65
+ }
66
+
67
+ abstract class MobileAd<
68
+ TNative extends PangleInterstitialAd | PangleRewardedAd,
69
+ TEvent extends PublicAdEventType,
70
+ > {
71
+ private readonly listeners = new Map<TEvent, Set<AdEventListener<TEvent>>>();
72
+ private readonly nativeSubscriptions = new Set<TEvent>();
73
+
74
+ protected loadedValue = false;
75
+ protected loadCalled = false;
76
+
77
+ protected constructor(
78
+ readonly adUnitId: string,
79
+ protected readonly nativeAd: TNative,
80
+ eventTypes: readonly TEvent[]
81
+ ) {
82
+ for (const eventType of eventTypes) {
83
+ this.listeners.set(eventType, new Set());
84
+ this.subscribeNative(eventType);
85
+ }
86
+ }
87
+
88
+ private subscribeNative(eventType: TEvent): void {
89
+ if (this.nativeSubscriptions.has(eventType)) {
90
+ return;
91
+ }
92
+
93
+ this.nativeAd.addAdEventListener(eventType, (payload) => {
94
+ if (
95
+ eventType === AdEventType.LOADED ||
96
+ eventType === RewardedAdEventType.LOADED
97
+ ) {
98
+ this.loadedValue = true;
99
+ } else if (
100
+ eventType === AdEventType.CLOSED ||
101
+ eventType === AdEventType.ERROR
102
+ ) {
103
+ this.loadedValue = false;
104
+ this.loadCalled = false;
105
+ }
106
+
107
+ const publicPayload = toPublicPayload(eventType, payload);
108
+ for (const listener of this.listeners.get(eventType) ?? []) {
109
+ listener(publicPayload as AdEventPayload<TEvent>);
110
+ }
111
+ });
112
+ this.nativeSubscriptions.add(eventType);
113
+ }
114
+
115
+ get loaded(): boolean {
116
+ return this.loadedValue;
117
+ }
118
+
119
+ load(): void {
120
+ if (this.loadedValue || this.loadCalled) {
121
+ return;
122
+ }
123
+ this.loadCalled = true;
124
+ this.nativeAd.load();
125
+ }
126
+
127
+ show(): Promise<void> {
128
+ if (!this.loadedValue) {
129
+ throw new Error(
130
+ `${this.constructor.name}.show() The requested ad has not loaded and could not be shown.`
131
+ );
132
+ }
133
+ return this.nativeAd.show();
134
+ }
135
+
136
+ protected addListener<T extends TEvent>(
137
+ type: T,
138
+ listener: AdEventListener<T>
139
+ ): () => void {
140
+ if (typeof listener !== 'function') {
141
+ throw new Error(
142
+ `${this.constructor.name}.addAdEventListener(_, *) 'listener' expected a function.`
143
+ );
144
+ }
145
+
146
+ const listeners = this.listeners.get(type);
147
+ if (!listeners) {
148
+ throw new Error(
149
+ `${this.constructor.name}.addAdEventListener(*) 'type' expected a valid event type value.`
150
+ );
151
+ }
152
+
153
+ this.subscribeNative(type);
154
+ listeners.add(listener as AdEventListener<TEvent>);
155
+ return () => listeners.delete(listener as AdEventListener<TEvent>);
156
+ }
157
+
158
+ protected addEventsListener<T extends TEvent>(
159
+ listener: AdEventsListener<T>
160
+ ): () => void {
161
+ if (typeof listener !== 'function') {
162
+ throw new Error(
163
+ `${this.constructor.name}.addAdEventsListener(*) 'listener' expected a function.`
164
+ );
165
+ }
166
+
167
+ const unsubscribers = [...this.listeners.keys()].map((type) =>
168
+ this.addListener(type, (payload) =>
169
+ listener({ type: type as T, payload: payload as AdEventPayload<T> })
170
+ )
171
+ );
172
+ return () => unsubscribers.forEach((unsubscribe) => unsubscribe());
173
+ }
174
+
175
+ removeAllListeners(): void {
176
+ for (const listeners of this.listeners.values()) {
177
+ listeners.clear();
178
+ }
179
+ this.nativeAd.removeAllListeners();
180
+ this.nativeSubscriptions.clear();
181
+ }
182
+ }
183
+
184
+ const INTERSTITIAL_EVENTS = Object.values(AdEventType) as AdEventType[];
185
+ const REWARDED_EVENTS = [
186
+ AdEventType.ERROR,
187
+ AdEventType.OPENED,
188
+ AdEventType.CLICKED,
189
+ AdEventType.CLOSED,
190
+ RewardedAdEventType.LOADED,
191
+ RewardedAdEventType.EARNED_REWARD,
192
+ ] as const;
193
+
194
+ export class InterstitialAd extends MobileAd<
195
+ PangleInterstitialAd,
196
+ AdEventType
197
+ > {
198
+ static createForAdRequest(adUnitId: string): InterstitialAd {
199
+ if (typeof adUnitId !== 'string' || adUnitId.length === 0) {
200
+ throw new Error(
201
+ "InterstitialAd.createForAdRequest(*) 'adUnitId' expected a non-empty string value."
202
+ );
203
+ }
204
+ return new InterstitialAd(
205
+ adUnitId,
206
+ nativeAds.createInterstitialAd(adUnitId)
207
+ );
208
+ }
209
+
210
+ private constructor(adUnitId: string, nativeAd: PangleInterstitialAd) {
211
+ super(adUnitId, nativeAd, INTERSTITIAL_EVENTS);
212
+ }
213
+
214
+ addAdEventsListener<T extends AdEventType>(
215
+ listener: AdEventsListener<T>
216
+ ): () => void {
217
+ return this.addEventsListener(listener);
218
+ }
219
+
220
+ addAdEventListener<T extends AdEventType>(
221
+ type: T,
222
+ listener: AdEventListener<T>
223
+ ): () => void {
224
+ return this.addListener(type, listener);
225
+ }
226
+ }
227
+
228
+ type RewardedEventType = AdEventType | RewardedAdEventType;
229
+
230
+ export class RewardedAd extends MobileAd<PangleRewardedAd, RewardedEventType> {
231
+ static createForAdRequest(adUnitId: string): RewardedAd {
232
+ if (typeof adUnitId !== 'string' || adUnitId.length === 0) {
233
+ throw new Error(
234
+ "RewardedAd.createForAdRequest(*) 'adUnitId' expected a non-empty string value."
235
+ );
236
+ }
237
+ return new RewardedAd(adUnitId, nativeAds.createRewardedAd(adUnitId));
238
+ }
239
+
240
+ private constructor(adUnitId: string, nativeAd: PangleRewardedAd) {
241
+ super(adUnitId, nativeAd, REWARDED_EVENTS);
242
+ }
243
+
244
+ load(verification?: PangleAdVerificationOptions): void {
245
+ if (this.loadedValue || this.loadCalled) {
246
+ return;
247
+ }
248
+ this.loadCalled = true;
249
+ this.nativeAd.load(verification);
250
+ }
251
+
252
+ addAdEventsListener<T extends RewardedEventType>(
253
+ listener: AdEventsListener<T>
254
+ ): () => void {
255
+ return this.addEventsListener(listener);
256
+ }
257
+
258
+ addAdEventListener<T extends RewardedEventType>(
259
+ type: T,
260
+ listener: AdEventListener<T>
261
+ ): () => void {
262
+ if (type === AdEventType.LOADED) {
263
+ throw new Error(
264
+ 'RewardedAd.addAdEventListener(*) use RewardedAdEventType.LOADED instead of AdEventType.LOADED.'
265
+ );
266
+ }
267
+ return this.addListener(type, listener);
268
+ }
269
+ }
270
+
271
+ export type MobileAdsModuleInterface = {
272
+ initialize(appId: string): Promise<AdapterStatus[]>;
273
+ setGDPRConsent(optIn: boolean): void;
274
+ setCCPAConsent(optIn: boolean): void;
275
+ setCOPPA(isUserCoppa: boolean): void;
276
+ };
277
+
278
+ const mobileAdsInstance: MobileAdsModuleInterface = {
279
+ async initialize(appId: string) {
280
+ await nativeAds.initialize(appId);
281
+ return [
282
+ {
283
+ name: 'Pangle',
284
+ description: 'Pangle Ads SDK is ready',
285
+ state: InitializationState.AdapterInitializationStateReady,
286
+ },
287
+ ];
288
+ },
289
+ setGDPRConsent: (optIn) => nativeAds.setGDPRConsent(optIn),
290
+ setCCPAConsent: (optIn) => nativeAds.setCCPAConsent(optIn),
291
+ setCOPPA: (isUserCoppa) => nativeAds.setCOPPA(isUserCoppa),
292
+ };
293
+
294
+ export const MobileAds = (): MobileAdsModuleInterface => mobileAdsInstance;
295
+
296
+ export default MobileAds;
297
+
298
+ export type {
299
+ PangleAdEventPayload,
300
+ PangleAdEventType,
301
+ PangleAdVerificationOptions,
302
+ PangleAds,
303
+ PangleInterstitialAd,
304
+ PangleRewardedAd,
305
+ } from './specs/PangleAds.nitro';
@@ -0,0 +1,66 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+
3
+ export type PangleAdEventType =
4
+ | 'loaded'
5
+ | 'error'
6
+ | 'opened'
7
+ | 'clicked'
8
+ | 'closed'
9
+ | 'rewarded_loaded'
10
+ | 'rewarded_earned_reward';
11
+
12
+ export interface PangleAdEventPayload {
13
+ errorCode?: number;
14
+ errorMessage?: string;
15
+ }
16
+
17
+ export interface PangleInterstitialAd extends HybridObject<{
18
+ ios: 'swift';
19
+ android: 'kotlin';
20
+ }> {
21
+ load(): void;
22
+ show(): Promise<void>;
23
+ addAdEventListener(
24
+ eventType: PangleAdEventType,
25
+ listener: (payload?: PangleAdEventPayload) => void
26
+ ): number;
27
+ removeAdEventListener(subscriptionId: number): void;
28
+ removeAllListeners(): void;
29
+ }
30
+
31
+ /**
32
+ * Passed as request `extraInfo` for server-side verification (SSV) of the
33
+ * reward.
34
+ */
35
+ export interface PangleAdVerificationOptions {
36
+ userId?: string;
37
+ customData?: string;
38
+ }
39
+
40
+ export interface PangleRewardedAd extends HybridObject<{
41
+ ios: 'swift';
42
+ android: 'kotlin';
43
+ }> {
44
+ load(verification?: PangleAdVerificationOptions): void;
45
+ show(): Promise<void>;
46
+ addAdEventListener(
47
+ eventType: PangleAdEventType,
48
+ listener: (payload?: PangleAdEventPayload) => void
49
+ ): number;
50
+ removeAdEventListener(subscriptionId: number): void;
51
+ removeAllListeners(): void;
52
+ }
53
+
54
+ export interface PangleAds extends HybridObject<{
55
+ ios: 'swift';
56
+ android: 'kotlin';
57
+ }> {
58
+ initialize(appId: string): Promise<void>;
59
+
60
+ setGDPRConsent(optIn: boolean): void;
61
+ setCCPAConsent(optIn: boolean): void;
62
+ setCOPPA(isUserCoppa: boolean): void;
63
+
64
+ createInterstitialAd(placementId: string): PangleInterstitialAd;
65
+ createRewardedAd(placementId: string): PangleRewardedAd;
66
+ }