react-native-google-mobile-ads 13.6.0 → 14.0.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 (218) hide show
  1. package/android/build.gradle +5 -3
  2. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsBannerAdViewManager.java +4 -13
  3. package/app.plugin.js +1 -0
  4. package/babel.config.js +1 -11
  5. package/docs/displaying-ads.mdx +1 -2
  6. package/docs/european-user-consent.mdx +23 -2
  7. package/docs/index.mdx +76 -77
  8. package/ios_config.sh +10 -0
  9. package/jest.config.js +3 -2
  10. package/lib/commonjs/AdEventType.js +1 -2
  11. package/lib/commonjs/AdEventType.js.map +1 -1
  12. package/lib/commonjs/AdsConsent.js +2 -4
  13. package/lib/commonjs/AdsConsent.js.map +1 -1
  14. package/lib/commonjs/AdsConsentDebugGeography.js +1 -2
  15. package/lib/commonjs/AdsConsentDebugGeography.js.map +1 -1
  16. package/lib/commonjs/AdsConsentPrivacyOptionsRequirementStatus.js +1 -2
  17. package/lib/commonjs/AdsConsentPrivacyOptionsRequirementStatus.js.map +1 -1
  18. package/lib/commonjs/AdsConsentPurposes.js +1 -2
  19. package/lib/commonjs/AdsConsentPurposes.js.map +1 -1
  20. package/lib/commonjs/AdsConsentSpecialFeatures.js +1 -2
  21. package/lib/commonjs/AdsConsentSpecialFeatures.js.map +1 -1
  22. package/lib/commonjs/AdsConsentStatus.js +1 -2
  23. package/lib/commonjs/AdsConsentStatus.js.map +1 -1
  24. package/lib/commonjs/BannerAdSize.js +2 -4
  25. package/lib/commonjs/BannerAdSize.js.map +1 -1
  26. package/lib/commonjs/GAMAdEventType.js +1 -2
  27. package/lib/commonjs/GAMAdEventType.js.map +1 -1
  28. package/lib/commonjs/MaxAdContentRating.js +1 -2
  29. package/lib/commonjs/MaxAdContentRating.js.map +1 -1
  30. package/lib/commonjs/MobileAds.js +2 -3
  31. package/lib/commonjs/MobileAds.js.map +1 -1
  32. package/lib/commonjs/NativeGoogleMobileAdsModule.js +1 -2
  33. package/lib/commonjs/NativeGoogleMobileAdsModule.js.map +1 -1
  34. package/lib/commonjs/RewardedAdEventType.js +1 -2
  35. package/lib/commonjs/RewardedAdEventType.js.map +1 -1
  36. package/lib/commonjs/TestIds.js +1 -2
  37. package/lib/commonjs/TestIds.js.map +1 -1
  38. package/lib/commonjs/ads/AppOpenAd.js.map +1 -1
  39. package/lib/commonjs/ads/BannerAd.js +18 -18
  40. package/lib/commonjs/ads/BannerAd.js.map +1 -1
  41. package/lib/commonjs/ads/BaseAd.js +10 -12
  42. package/lib/commonjs/ads/BaseAd.js.map +1 -1
  43. package/lib/commonjs/ads/GAMBannerAd.js +18 -18
  44. package/lib/commonjs/ads/GAMBannerAd.js.map +1 -1
  45. package/lib/commonjs/ads/GAMInterstitialAd.js.map +1 -1
  46. package/lib/commonjs/ads/GoogleMobileAdsBannerViewNativeComponent.js +5 -5
  47. package/lib/commonjs/ads/GoogleMobileAdsBannerViewNativeComponent.js.map +1 -1
  48. package/lib/commonjs/ads/InterstitialAd.js.map +1 -1
  49. package/lib/commonjs/ads/MobileAd.js.map +1 -1
  50. package/lib/commonjs/ads/RewardedAd.js.map +1 -1
  51. package/lib/commonjs/ads/RewardedInterstitialAd.js.map +1 -1
  52. package/lib/commonjs/common/constants.js +1 -2
  53. package/lib/commonjs/common/constants.js.map +1 -1
  54. package/lib/commonjs/common/debounce.js +1 -4
  55. package/lib/commonjs/common/debounce.js.map +1 -1
  56. package/lib/commonjs/common/index.js.map +1 -1
  57. package/lib/commonjs/common/validate.js +1 -2
  58. package/lib/commonjs/common/validate.js.map +1 -1
  59. package/lib/commonjs/declarations.d.js.map +1 -1
  60. package/lib/commonjs/hooks/useAppOpenAd.js +2 -3
  61. package/lib/commonjs/hooks/useAppOpenAd.js.map +1 -1
  62. package/lib/commonjs/hooks/useForeground.js.map +1 -1
  63. package/lib/commonjs/hooks/useFullScreenAd.js +4 -5
  64. package/lib/commonjs/hooks/useFullScreenAd.js.map +1 -1
  65. package/lib/commonjs/hooks/useInterstitialAd.js +2 -3
  66. package/lib/commonjs/hooks/useInterstitialAd.js.map +1 -1
  67. package/lib/commonjs/hooks/useRewardedAd.js +2 -3
  68. package/lib/commonjs/hooks/useRewardedAd.js.map +1 -1
  69. package/lib/commonjs/hooks/useRewardedInterstitialAd.js +2 -3
  70. package/lib/commonjs/hooks/useRewardedInterstitialAd.js.map +1 -1
  71. package/lib/commonjs/index.js +3 -4
  72. package/lib/commonjs/index.js.map +1 -1
  73. package/lib/commonjs/internal/GoogleMobileAdsNativeEventEmitter.js +8 -2
  74. package/lib/commonjs/internal/GoogleMobileAdsNativeEventEmitter.js.map +1 -1
  75. package/lib/commonjs/internal/NativeError.js.map +1 -1
  76. package/lib/commonjs/internal/SharedEventEmitter.js +2 -5
  77. package/lib/commonjs/internal/SharedEventEmitter.js.map +1 -1
  78. package/lib/commonjs/types/AdEventListener.js.map +1 -1
  79. package/lib/commonjs/types/AdEventsListener.js.map +1 -1
  80. package/lib/commonjs/types/AdShowOptions.js.map +1 -1
  81. package/lib/commonjs/types/AdStates.js.map +1 -1
  82. package/lib/commonjs/types/AdapterStatus.js +1 -2
  83. package/lib/commonjs/types/AdapterStatus.js.map +1 -1
  84. package/lib/commonjs/types/AdsConsent.interface.js.map +1 -1
  85. package/lib/commonjs/types/AppEvent.js.map +1 -1
  86. package/lib/commonjs/types/BannerAdProps.js.map +1 -1
  87. package/lib/commonjs/types/MobileAd.interface.js.map +1 -1
  88. package/lib/commonjs/types/MobileAdsModule.interface.js.map +1 -1
  89. package/lib/commonjs/types/PaidEventListener.js.map +1 -1
  90. package/lib/commonjs/types/RequestConfiguration.js.map +1 -1
  91. package/lib/commonjs/types/RequestOptions.js.map +1 -1
  92. package/lib/commonjs/types/RewardedAdReward.js.map +1 -1
  93. package/lib/commonjs/types/index.js.map +1 -1
  94. package/lib/commonjs/validateAdRequestConfiguration.js.map +1 -1
  95. package/lib/commonjs/validateAdRequestOptions.js +1 -2
  96. package/lib/commonjs/validateAdRequestOptions.js.map +1 -1
  97. package/lib/commonjs/validateAdShowOptions.js.map +1 -1
  98. package/lib/commonjs/version.js +1 -2
  99. package/lib/commonjs/version.js.map +1 -1
  100. package/lib/module/AdEventType.js.map +1 -1
  101. package/lib/module/AdsConsent.js +1 -2
  102. package/lib/module/AdsConsent.js.map +1 -1
  103. package/lib/module/AdsConsentDebugGeography.js.map +1 -1
  104. package/lib/module/AdsConsentPrivacyOptionsRequirementStatus.js.map +1 -1
  105. package/lib/module/AdsConsentPurposes.js.map +1 -1
  106. package/lib/module/AdsConsentSpecialFeatures.js.map +1 -1
  107. package/lib/module/AdsConsentStatus.js.map +1 -1
  108. package/lib/module/BannerAdSize.js.map +1 -1
  109. package/lib/module/GAMAdEventType.js.map +1 -1
  110. package/lib/module/MaxAdContentRating.js.map +1 -1
  111. package/lib/module/MobileAds.js.map +1 -1
  112. package/lib/module/NativeGoogleMobileAdsModule.js.map +1 -1
  113. package/lib/module/RewardedAdEventType.js.map +1 -1
  114. package/lib/module/TestIds.js.map +1 -1
  115. package/lib/module/ads/AppOpenAd.js.map +1 -1
  116. package/lib/module/ads/BannerAd.js +1 -1
  117. package/lib/module/ads/BannerAd.js.map +1 -1
  118. package/lib/module/ads/BaseAd.js +7 -8
  119. package/lib/module/ads/BaseAd.js.map +1 -1
  120. package/lib/module/ads/GAMBannerAd.js +1 -1
  121. package/lib/module/ads/GAMBannerAd.js.map +1 -1
  122. package/lib/module/ads/GAMInterstitialAd.js.map +1 -1
  123. package/lib/module/ads/GoogleMobileAdsBannerViewNativeComponent.js +2 -0
  124. package/lib/module/ads/GoogleMobileAdsBannerViewNativeComponent.js.map +1 -1
  125. package/lib/module/ads/InterstitialAd.js.map +1 -1
  126. package/lib/module/ads/MobileAd.js.map +1 -1
  127. package/lib/module/ads/RewardedAd.js.map +1 -1
  128. package/lib/module/ads/RewardedInterstitialAd.js.map +1 -1
  129. package/lib/module/common/constants.js.map +1 -1
  130. package/lib/module/common/debounce.js +1 -4
  131. package/lib/module/common/debounce.js.map +1 -1
  132. package/lib/module/common/index.js.map +1 -1
  133. package/lib/module/common/validate.js +1 -2
  134. package/lib/module/common/validate.js.map +1 -1
  135. package/lib/module/declarations.d.js.map +1 -1
  136. package/lib/module/hooks/useAppOpenAd.js +1 -2
  137. package/lib/module/hooks/useAppOpenAd.js.map +1 -1
  138. package/lib/module/hooks/useForeground.js.map +1 -1
  139. package/lib/module/hooks/useFullScreenAd.js +4 -5
  140. package/lib/module/hooks/useFullScreenAd.js.map +1 -1
  141. package/lib/module/hooks/useInterstitialAd.js +1 -2
  142. package/lib/module/hooks/useInterstitialAd.js.map +1 -1
  143. package/lib/module/hooks/useRewardedAd.js +1 -2
  144. package/lib/module/hooks/useRewardedAd.js.map +1 -1
  145. package/lib/module/hooks/useRewardedInterstitialAd.js +1 -2
  146. package/lib/module/hooks/useRewardedInterstitialAd.js.map +1 -1
  147. package/lib/module/index.js.map +1 -1
  148. package/lib/module/internal/GoogleMobileAdsNativeEventEmitter.js +7 -0
  149. package/lib/module/internal/GoogleMobileAdsNativeEventEmitter.js.map +1 -1
  150. package/lib/module/internal/NativeError.js.map +1 -1
  151. package/lib/module/internal/SharedEventEmitter.js +2 -3
  152. package/lib/module/internal/SharedEventEmitter.js.map +1 -1
  153. package/lib/module/types/AdEventListener.js.map +1 -1
  154. package/lib/module/types/AdEventsListener.js.map +1 -1
  155. package/lib/module/types/AdShowOptions.js.map +1 -1
  156. package/lib/module/types/AdStates.js.map +1 -1
  157. package/lib/module/types/AdapterStatus.js.map +1 -1
  158. package/lib/module/types/AdsConsent.interface.js.map +1 -1
  159. package/lib/module/types/AppEvent.js.map +1 -1
  160. package/lib/module/types/BannerAdProps.js.map +1 -1
  161. package/lib/module/types/MobileAd.interface.js.map +1 -1
  162. package/lib/module/types/MobileAdsModule.interface.js.map +1 -1
  163. package/lib/module/types/PaidEventListener.js.map +1 -1
  164. package/lib/module/types/RequestConfiguration.js.map +1 -1
  165. package/lib/module/types/RequestOptions.js.map +1 -1
  166. package/lib/module/types/RewardedAdReward.js.map +1 -1
  167. package/lib/module/types/index.js.map +1 -1
  168. package/lib/module/validateAdRequestConfiguration.js.map +1 -1
  169. package/lib/module/validateAdRequestOptions.js +1 -2
  170. package/lib/module/validateAdRequestOptions.js.map +1 -1
  171. package/lib/module/validateAdShowOptions.js.map +1 -1
  172. package/lib/module/version.js +1 -1
  173. package/lib/module/version.js.map +1 -1
  174. package/lib/typescript/ads/BannerAd.d.ts +1 -1
  175. package/lib/typescript/ads/GAMBannerAd.d.ts +1 -1
  176. package/lib/typescript/ads/GAMInterstitialAd.d.ts.map +1 -1
  177. package/lib/typescript/ads/GoogleMobileAdsBannerViewNativeComponent.d.ts +2 -2
  178. package/lib/typescript/ads/GoogleMobileAdsBannerViewNativeComponent.d.ts.map +1 -1
  179. package/lib/typescript/ads/MobileAd.d.ts +3 -3
  180. package/lib/typescript/ads/MobileAd.d.ts.map +1 -1
  181. package/lib/typescript/common/debounce.d.ts +1 -1
  182. package/lib/typescript/common/debounce.d.ts.map +1 -1
  183. package/lib/typescript/common/validate.d.ts +4 -4
  184. package/lib/typescript/common/validate.d.ts.map +1 -1
  185. package/lib/typescript/index.d.ts +1 -1
  186. package/lib/typescript/internal/GoogleMobileAdsNativeEventEmitter.d.ts.map +1 -1
  187. package/lib/typescript/internal/SharedEventEmitter.d.ts +1 -1
  188. package/lib/typescript/internal/SharedEventEmitter.d.ts.map +1 -1
  189. package/lib/typescript/types/AdEventListener.d.ts +2 -2
  190. package/lib/typescript/types/AdEventListener.d.ts.map +1 -1
  191. package/lib/typescript/types/AdEventsListener.d.ts +1 -1
  192. package/lib/typescript/types/AdEventsListener.d.ts.map +1 -1
  193. package/lib/typescript/types/AdapterStatus.d.ts +1 -1
  194. package/lib/typescript/types/AdapterStatus.d.ts.map +1 -1
  195. package/lib/typescript/types/BannerAdProps.d.ts +1 -1
  196. package/lib/typescript/types/BannerAdProps.d.ts.map +1 -1
  197. package/lib/typescript/types/PaidEventListener.d.ts +2 -2
  198. package/lib/typescript/types/PaidEventListener.d.ts.map +1 -1
  199. package/lib/typescript/types/RequestOptions.d.ts +1 -1
  200. package/lib/typescript/types/RequestOptions.d.ts.map +1 -1
  201. package/lib/typescript/version.d.ts +1 -1
  202. package/package.json +24 -7
  203. package/plugin/__tests__/__snapshots__/plugin.test.ts.snap +140 -0
  204. package/plugin/__tests__/fixtures/app-without-params.json +11 -0
  205. package/plugin/__tests__/fixtures/app.json +24 -0
  206. package/plugin/__tests__/fixtures/package.json +19 -0
  207. package/plugin/__tests__/plugin.test.ts +96 -0
  208. package/plugin/build/index.d.ts +12 -0
  209. package/plugin/build/index.js +101 -0
  210. package/plugin/jest.config.js +1 -0
  211. package/plugin/src/index.ts +194 -0
  212. package/plugin/tsconfig.json +9 -0
  213. package/src/ads/BaseAd.tsx +3 -3
  214. package/src/ads/GoogleMobileAdsBannerViewNativeComponent.ts +2 -0
  215. package/src/internal/GoogleMobileAdsNativeEventEmitter.ts +7 -0
  216. package/src/internal/SharedEventEmitter.ts +2 -4
  217. package/src/types/BannerAdProps.ts +1 -1
  218. package/src/version.ts +1 -1
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "example",
3
+ "slug": "example",
4
+ "android": {
5
+ "package": "com.example"
6
+ },
7
+ "ios": {
8
+ "bundleIdentifier": "com.example"
9
+ },
10
+ "plugins": [["../../build"]]
11
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "example",
3
+ "slug": "example",
4
+ "android": {
5
+ "package": "com.example"
6
+ },
7
+ "ios": {
8
+ "bundleIdentifier": "com.example"
9
+ },
10
+ "plugins": [
11
+ [
12
+ "../../build",
13
+ {
14
+ "androidAppId": "TestAppId",
15
+ "iosAppId": "TestIosId",
16
+ "delayAppMeasurementInit": true,
17
+ "optimizeInitialization": true,
18
+ "optimizeAdLoading": true,
19
+ "skAdNetworkItems": ["TestSkAdNetworkItem1", "TestSkAdNetworkItem2"],
20
+ "userTrackingUsageDescription": "TestUserTrackingUsageDescription"
21
+ }
22
+ ]
23
+ ]
24
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "example",
3
+ "version": "1.0.0",
4
+ "scripts": {
5
+ "start": "expo start --dev-client",
6
+ "android": "expo run:android",
7
+ "ios": "expo run:ios"
8
+ },
9
+ "devDependencies": {
10
+ "@babel/core": "^7.12.9"
11
+ },
12
+ "dependencies": {
13
+ "expo": "~47.0.14",
14
+ "expo-splash-screen": "~0.17.5",
15
+ "expo-status-bar": "~1.4.2",
16
+ "react": "18.1.0",
17
+ "react-native": "0.70.8"
18
+ }
19
+ }
@@ -0,0 +1,96 @@
1
+ import { exec } from 'child_process';
2
+ import path from 'path';
3
+ import fs from 'fs/promises';
4
+ import util from 'util';
5
+
6
+ const execAsync = util.promisify(exec);
7
+
8
+ describe('Expo Config Plugin Tests', () => {
9
+ const fixturesPath = path.join(__dirname, 'fixtures');
10
+ const testAppPath = path.join(__dirname, 'build');
11
+ const infoPlistPath = path.join(testAppPath, 'ios', 'example', 'Info.plist');
12
+ const androidManifestPath = path.join(
13
+ testAppPath,
14
+ 'android',
15
+ 'app',
16
+ 'src',
17
+ 'main',
18
+ 'AndroidManifest.xml',
19
+ );
20
+
21
+ beforeEach(async () => {
22
+ await fs.rm(testAppPath, { recursive: true, force: true });
23
+ await fs.mkdir(testAppPath);
24
+ await fs.copyFile(path.join(fixturesPath, 'app.json'), path.join(testAppPath, 'app.json'));
25
+ await fs.copyFile(
26
+ path.join(fixturesPath, 'package.json'),
27
+ path.join(testAppPath, 'package.json'),
28
+ );
29
+ });
30
+
31
+ it('Technically requires no parameters', async () => {
32
+ await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
33
+ });
34
+
35
+ it('Warns about missing androidAppId', async () => {
36
+ await fs.copyFile(
37
+ path.join(fixturesPath, 'app-without-params.json'),
38
+ path.join(testAppPath, 'app.json'),
39
+ );
40
+
41
+ const { stderr } = await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
42
+ expect(stderr).toMatch(/No 'androidAppId' was provided/);
43
+ });
44
+
45
+ it('Warns about missing iosAppId', async () => {
46
+ await fs.copyFile(
47
+ path.join(fixturesPath, 'app-without-params.json'),
48
+ path.join(testAppPath, 'app.json'),
49
+ );
50
+
51
+ const { stderr } = await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
52
+ expect(stderr).toMatch(/No 'iosAppId' was provided/);
53
+ });
54
+
55
+ it('Optimizes initialization on Android by default', async () => {
56
+ await fs.copyFile(
57
+ path.join(fixturesPath, 'app-without-params.json'),
58
+ path.join(testAppPath, 'app.json'),
59
+ );
60
+
61
+ await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
62
+
63
+ const androidManifest = await fs.readFile(androidManifestPath, 'utf8');
64
+ expect(androidManifest).toContain(
65
+ '<meta-data android:name="com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION" android:value="true" tools:replace="android:value"/>',
66
+ );
67
+ });
68
+
69
+ it('Optimizes ad loading on Android by default', async () => {
70
+ await fs.copyFile(
71
+ path.join(fixturesPath, 'app-without-params.json'),
72
+ path.join(testAppPath, 'app.json'),
73
+ );
74
+
75
+ await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
76
+
77
+ const androidManifest = await fs.readFile(androidManifestPath, 'utf8');
78
+ expect(androidManifest).toContain(
79
+ '<meta-data android:name="com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING" android:value="true" tools:replace="android:value"/>',
80
+ );
81
+ });
82
+
83
+ it('Should modify AndroidManifest.xml', async () => {
84
+ await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
85
+
86
+ const androidManifest = await fs.readFile(androidManifestPath, 'utf8');
87
+ expect(androidManifest).toMatchSnapshot();
88
+ });
89
+
90
+ it('Should modify Info.plist', async () => {
91
+ await execAsync(`yarn expo prebuild --no-install ${testAppPath}`);
92
+
93
+ const infoPlist = await fs.readFile(infoPlistPath, 'utf8');
94
+ expect(infoPlist).toMatchSnapshot();
95
+ });
96
+ });
@@ -0,0 +1,12 @@
1
+ import { ConfigPlugin } from '@expo/config-plugins';
2
+ type PluginParameters = {
3
+ androidAppId?: string;
4
+ iosAppId?: string;
5
+ delayAppMeasurementInit?: boolean;
6
+ optimizeInitialization?: boolean;
7
+ optimizeAdLoading?: boolean;
8
+ skAdNetworkItems?: string[];
9
+ userTrackingUsageDescription?: string;
10
+ };
11
+ declare const withReactNativeGoogleMobileAds: ConfigPlugin<PluginParameters>;
12
+ export default withReactNativeGoogleMobileAds;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config_plugins_1 = require("@expo/config-plugins");
4
+ function addReplacingMainApplicationMetaDataItem(manifest, itemName, itemValue) {
5
+ config_plugins_1.AndroidConfig.Manifest.ensureToolsAvailable(manifest);
6
+ const newItem = {
7
+ $: {
8
+ 'android:name': itemName,
9
+ 'android:value': itemValue,
10
+ 'tools:replace': 'android:value',
11
+ },
12
+ };
13
+ const mainApplication = config_plugins_1.AndroidConfig.Manifest.getMainApplicationOrThrow(manifest);
14
+ mainApplication['meta-data'] = mainApplication['meta-data'] ?? [];
15
+ mainApplication['meta-data'].push(newItem);
16
+ return manifest;
17
+ }
18
+ const withAndroidAppId = (config, androidAppId) => {
19
+ if (androidAppId === undefined)
20
+ return config;
21
+ return (0, config_plugins_1.withAndroidManifest)(config, config => {
22
+ addReplacingMainApplicationMetaDataItem(config.modResults, 'com.google.android.gms.ads.APPLICATION_ID', androidAppId);
23
+ return config;
24
+ });
25
+ };
26
+ const withAndroidAppMeasurementInitDelayed = (config, delayAppMeasurementInit) => {
27
+ if (delayAppMeasurementInit === undefined)
28
+ return config;
29
+ return (0, config_plugins_1.withAndroidManifest)(config, config => {
30
+ addReplacingMainApplicationMetaDataItem(config.modResults, 'com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT', delayAppMeasurementInit.toString());
31
+ return config;
32
+ });
33
+ };
34
+ const withAndroidInitializationOptimized = (config, optimizeInitialization = true) => {
35
+ return (0, config_plugins_1.withAndroidManifest)(config, config => {
36
+ addReplacingMainApplicationMetaDataItem(config.modResults, 'com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION', optimizeInitialization.toString());
37
+ return config;
38
+ });
39
+ };
40
+ const withAndroidAdLoadingOptimized = (config, optimizeAdLoading = true) => {
41
+ return (0, config_plugins_1.withAndroidManifest)(config, config => {
42
+ addReplacingMainApplicationMetaDataItem(config.modResults, 'com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING', optimizeAdLoading.toString());
43
+ return config;
44
+ });
45
+ };
46
+ const withIosAppId = (config, iosAppId) => {
47
+ if (iosAppId === undefined)
48
+ return config;
49
+ return (0, config_plugins_1.withInfoPlist)(config, config => {
50
+ config.modResults.GADApplicationIdentifier = iosAppId;
51
+ return config;
52
+ });
53
+ };
54
+ const withIosAppMeasurementInitDelayed = (config, delayAppMeasurementInit = false) => {
55
+ return (0, config_plugins_1.withInfoPlist)(config, config => {
56
+ config.modResults.GADDelayAppMeasurementInit = delayAppMeasurementInit;
57
+ return config;
58
+ });
59
+ };
60
+ const withIosSkAdNetworkItems = (config, skAdNetworkItems) => {
61
+ if (skAdNetworkItems === undefined)
62
+ return config;
63
+ return (0, config_plugins_1.withInfoPlist)(config, config => {
64
+ config.modResults.SKAdNetworkItems = config.modResults.SKAdNetworkItems ?? [];
65
+ const existingIdentifiers = config.modResults.SKAdNetworkItems.map((item) => item.SKAdNetworkIdentifier);
66
+ const missingIdentifiers = skAdNetworkItems.filter(skAdNetworkItem => !existingIdentifiers.includes(skAdNetworkItem));
67
+ config.modResults.SKAdNetworkItems.push(...missingIdentifiers.map(identifier => ({
68
+ SKAdNetworkIdentifier: identifier,
69
+ })));
70
+ return config;
71
+ });
72
+ };
73
+ const withIosUserTrackingUsageDescription = (config, userTrackingUsageDescription) => {
74
+ if (userTrackingUsageDescription === undefined)
75
+ return config;
76
+ return (0, config_plugins_1.withInfoPlist)(config, config => {
77
+ config.modResults.NSUserTrackingUsageDescription = userTrackingUsageDescription;
78
+ return config;
79
+ });
80
+ };
81
+ const withReactNativeGoogleMobileAds = (config, { androidAppId, delayAppMeasurementInit, optimizeInitialization, optimizeAdLoading, iosAppId, skAdNetworkItems, userTrackingUsageDescription, } = {}) => {
82
+ if (androidAppId === undefined) {
83
+ console.warn("No 'androidAppId' was provided. The native Google Mobile Ads SDK will crash on Android without it.");
84
+ }
85
+ if (iosAppId === undefined) {
86
+ console.warn("No 'iosAppId' was provided. The native Google Mobile Ads SDK will crash on iOS without it.");
87
+ }
88
+ return (0, config_plugins_1.withPlugins)(config, [
89
+ // Android
90
+ [withAndroidAppId, androidAppId],
91
+ [withAndroidAppMeasurementInitDelayed, delayAppMeasurementInit],
92
+ [withAndroidInitializationOptimized, optimizeInitialization],
93
+ [withAndroidAdLoadingOptimized, optimizeAdLoading],
94
+ // iOS
95
+ [withIosAppId, iosAppId],
96
+ [withIosAppMeasurementInitDelayed, delayAppMeasurementInit],
97
+ [withIosSkAdNetworkItems, skAdNetworkItems],
98
+ [withIosUserTrackingUsageDescription, userTrackingUsageDescription],
99
+ ]);
100
+ };
101
+ exports.default = withReactNativeGoogleMobileAds;
@@ -0,0 +1 @@
1
+ module.exports = require("expo-module-scripts/jest-preset-plugin");
@@ -0,0 +1,194 @@
1
+ import {
2
+ AndroidConfig,
3
+ ConfigPlugin,
4
+ withAndroidManifest,
5
+ withPlugins,
6
+ withInfoPlist,
7
+ } from '@expo/config-plugins';
8
+
9
+ type PluginParameters = {
10
+ androidAppId?: string;
11
+ iosAppId?: string;
12
+ delayAppMeasurementInit?: boolean;
13
+ optimizeInitialization?: boolean;
14
+ optimizeAdLoading?: boolean;
15
+ skAdNetworkItems?: string[];
16
+ userTrackingUsageDescription?: string;
17
+ };
18
+
19
+ function addReplacingMainApplicationMetaDataItem(
20
+ manifest: AndroidConfig.Manifest.AndroidManifest,
21
+ itemName: string,
22
+ itemValue: string,
23
+ ): AndroidConfig.Manifest.AndroidManifest {
24
+ AndroidConfig.Manifest.ensureToolsAvailable(manifest);
25
+
26
+ const newItem = {
27
+ $: {
28
+ 'android:name': itemName,
29
+ 'android:value': itemValue,
30
+ 'tools:replace': 'android:value',
31
+ },
32
+ } as AndroidConfig.Manifest.ManifestMetaData;
33
+
34
+ const mainApplication = AndroidConfig.Manifest.getMainApplicationOrThrow(manifest);
35
+ mainApplication['meta-data'] = mainApplication['meta-data'] ?? [];
36
+ mainApplication['meta-data'].push(newItem);
37
+
38
+ return manifest;
39
+ }
40
+
41
+ const withAndroidAppId: ConfigPlugin<PluginParameters['androidAppId']> = (config, androidAppId) => {
42
+ if (androidAppId === undefined) return config;
43
+
44
+ return withAndroidManifest(config, config => {
45
+ addReplacingMainApplicationMetaDataItem(
46
+ config.modResults,
47
+ 'com.google.android.gms.ads.APPLICATION_ID',
48
+ androidAppId,
49
+ );
50
+
51
+ return config;
52
+ });
53
+ };
54
+
55
+ const withAndroidAppMeasurementInitDelayed: ConfigPlugin<
56
+ PluginParameters['delayAppMeasurementInit']
57
+ > = (config, delayAppMeasurementInit) => {
58
+ if (delayAppMeasurementInit === undefined) return config;
59
+
60
+ return withAndroidManifest(config, config => {
61
+ addReplacingMainApplicationMetaDataItem(
62
+ config.modResults,
63
+ 'com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT',
64
+ delayAppMeasurementInit.toString(),
65
+ );
66
+
67
+ return config;
68
+ });
69
+ };
70
+
71
+ const withAndroidInitializationOptimized: ConfigPlugin<
72
+ PluginParameters['optimizeInitialization']
73
+ > = (config, optimizeInitialization = true) => {
74
+ return withAndroidManifest(config, config => {
75
+ addReplacingMainApplicationMetaDataItem(
76
+ config.modResults,
77
+ 'com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION',
78
+ optimizeInitialization.toString(),
79
+ );
80
+
81
+ return config;
82
+ });
83
+ };
84
+
85
+ const withAndroidAdLoadingOptimized: ConfigPlugin<PluginParameters['optimizeAdLoading']> = (
86
+ config,
87
+ optimizeAdLoading = true,
88
+ ) => {
89
+ return withAndroidManifest(config, config => {
90
+ addReplacingMainApplicationMetaDataItem(
91
+ config.modResults,
92
+ 'com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING',
93
+ optimizeAdLoading.toString(),
94
+ );
95
+
96
+ return config;
97
+ });
98
+ };
99
+
100
+ const withIosAppId: ConfigPlugin<PluginParameters['iosAppId']> = (config, iosAppId) => {
101
+ if (iosAppId === undefined) return config;
102
+
103
+ return withInfoPlist(config, config => {
104
+ config.modResults.GADApplicationIdentifier = iosAppId;
105
+ return config;
106
+ });
107
+ };
108
+
109
+ const withIosAppMeasurementInitDelayed: ConfigPlugin<
110
+ PluginParameters['delayAppMeasurementInit']
111
+ > = (config, delayAppMeasurementInit = false) => {
112
+ return withInfoPlist(config, config => {
113
+ config.modResults.GADDelayAppMeasurementInit = delayAppMeasurementInit;
114
+ return config;
115
+ });
116
+ };
117
+
118
+ const withIosSkAdNetworkItems: ConfigPlugin<PluginParameters['skAdNetworkItems']> = (
119
+ config,
120
+ skAdNetworkItems,
121
+ ) => {
122
+ if (skAdNetworkItems === undefined) return config;
123
+
124
+ return withInfoPlist(config, config => {
125
+ config.modResults.SKAdNetworkItems = config.modResults.SKAdNetworkItems ?? [];
126
+
127
+ const existingIdentifiers = config.modResults.SKAdNetworkItems.map(
128
+ (item: { SKAdNetworkIdentifier: string }) => item.SKAdNetworkIdentifier,
129
+ );
130
+
131
+ const missingIdentifiers = skAdNetworkItems.filter(
132
+ skAdNetworkItem => !existingIdentifiers.includes(skAdNetworkItem),
133
+ );
134
+
135
+ config.modResults.SKAdNetworkItems.push(
136
+ ...missingIdentifiers.map(identifier => ({
137
+ SKAdNetworkIdentifier: identifier,
138
+ })),
139
+ );
140
+
141
+ return config;
142
+ });
143
+ };
144
+
145
+ const withIosUserTrackingUsageDescription: ConfigPlugin<
146
+ PluginParameters['userTrackingUsageDescription']
147
+ > = (config, userTrackingUsageDescription) => {
148
+ if (userTrackingUsageDescription === undefined) return config;
149
+
150
+ return withInfoPlist(config, config => {
151
+ config.modResults.NSUserTrackingUsageDescription = userTrackingUsageDescription;
152
+ return config;
153
+ });
154
+ };
155
+
156
+ const withReactNativeGoogleMobileAds: ConfigPlugin<PluginParameters> = (
157
+ config,
158
+ {
159
+ androidAppId,
160
+ delayAppMeasurementInit,
161
+ optimizeInitialization,
162
+ optimizeAdLoading,
163
+ iosAppId,
164
+ skAdNetworkItems,
165
+ userTrackingUsageDescription,
166
+ } = {},
167
+ ) => {
168
+ if (androidAppId === undefined) {
169
+ console.warn(
170
+ "No 'androidAppId' was provided. The native Google Mobile Ads SDK will crash on Android without it.",
171
+ );
172
+ }
173
+
174
+ if (iosAppId === undefined) {
175
+ console.warn(
176
+ "No 'iosAppId' was provided. The native Google Mobile Ads SDK will crash on iOS without it.",
177
+ );
178
+ }
179
+
180
+ return withPlugins(config, [
181
+ // Android
182
+ [withAndroidAppId, androidAppId],
183
+ [withAndroidAppMeasurementInitDelayed, delayAppMeasurementInit],
184
+ [withAndroidInitializationOptimized, optimizeInitialization],
185
+ [withAndroidAdLoadingOptimized, optimizeAdLoading],
186
+ // iOS
187
+ [withIosAppId, iosAppId],
188
+ [withIosAppMeasurementInitDelayed, delayAppMeasurementInit],
189
+ [withIosSkAdNetworkItems, skAdNetworkItems],
190
+ [withIosUserTrackingUsageDescription, userTrackingUsageDescription],
191
+ ]);
192
+ };
193
+
194
+ export default withReactNativeGoogleMobileAds;
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "expo-module-scripts/tsconfig.plugin",
3
+ "compilerOptions": {
4
+ "outDir": "build",
5
+ "rootDir": "src"
6
+ },
7
+ "include": ["./src"],
8
+ "exclude": ["**/__mocks__/*", "**/__tests__/*"]
9
+ }
@@ -17,7 +17,7 @@
17
17
  */
18
18
 
19
19
  import React, { useState, useEffect } from 'react';
20
- import { NativeSyntheticEvent, Platform } from 'react-native';
20
+ import { DimensionValue, NativeSyntheticEvent, Platform } from 'react-native';
21
21
  import { isFunction } from '../common';
22
22
  import { RevenuePrecisions } from '../common/constants';
23
23
  import { NativeError } from '../internal/NativeError';
@@ -34,7 +34,7 @@ export const BaseAd = React.forwardRef<
34
34
  React.ElementRef<typeof GoogleMobileAdsBannerView>,
35
35
  GAMBannerAdProps
36
36
  >(({ unitId, sizes, requestOptions, manualImpressionsEnabled, ...props }, ref) => {
37
- const [dimensions, setDimensions] = useState<(number | string)[]>([0, 0]);
37
+ const [dimensions, setDimensions] = useState<(number | DimensionValue)[]>([0, 0]);
38
38
 
39
39
  const debouncedSetDimensions = debounce(setDimensions, 100);
40
40
 
@@ -157,7 +157,7 @@ export const BaseAd = React.forwardRef<
157
157
 
158
158
  const style = sizes.includes(GAMBannerAdSize.FLUID)
159
159
  ? {
160
- width: '100%',
160
+ width: '100%' as DimensionValue,
161
161
  height: dimensions[1],
162
162
  }
163
163
  : {
@@ -32,6 +32,8 @@ interface NativeCommands {
32
32
  load: (viewRef: React.ElementRef<ComponentType>) => void;
33
33
  }
34
34
 
35
+ // SyntaxError "'Commands' is a reserved export and may only be used to export the result of codegenNativeCommands"
36
+ // @ts-ignore -- migration to react-native 0.73+
35
37
  export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
36
38
  supportedCommands: ['recordManualImpression', 'load'],
37
39
  });
@@ -52,8 +52,11 @@ class GANativeEventEmitter extends NativeEventEmitter {
52
52
  const originalRemove = subscription.remove;
53
53
  const newRemove = () => {
54
54
  RNAppModule.eventsRemoveListener(eventType, false);
55
+ // This is for RN <= 0.64 - 65 and greater no longer have removeSubscription
56
+ // @ts-expect-error - "Property 'removeSubscription' does not exist on type 'NativeEventEmitter"
55
57
  if (super.removeSubscription != null) {
56
58
  // This is for RN <= 0.64 - 65 and greater no longer have removeSubscription
59
+ // @ts-expect-error - "Property 'removeSubscription' does not exist on type 'NativeEventEmitter"
57
60
  super.removeSubscription(subscription);
58
61
  } else if (originalRemove != null) {
59
62
  // This is for RN >= 0.65
@@ -72,7 +75,11 @@ class GANativeEventEmitter extends NativeEventEmitter {
72
75
  // This is likely no longer ever called, but it is here for backwards compatibility with RN <= 0.64
73
76
  removeSubscription(subscription: EmitterSubscription) {
74
77
  RNAppModule.eventsRemoveListener(subscription.eventType.replace('rnapp_', ''), false);
78
+ // This is for RN <= 0.64 - 65 and greater no longer have removeSubscription
79
+ // @ts-expect-error - "Property 'removeSubscription' does not exist on type 'NativeEventEmitter"
75
80
  if (super.removeSubscription != null) {
81
+ // This is for RN <= 0.64 - 65 and greater no longer have removeSubscription
82
+ // @ts-expect-error - "Property 'removeSubscription' does not exist on type 'NativeEventEmitter"
76
83
  super.removeSubscription(subscription);
77
84
  }
78
85
  }
@@ -15,8 +15,6 @@
15
15
  *
16
16
  */
17
17
 
18
- // @ts-ignore: Could not find a declaration file
19
- import Emitter from 'react-native/Libraries/vendor/emitter/EventEmitter';
20
- import { EventEmitter } from 'react-native';
18
+ import EventEmitter from 'react-native/Libraries/vendor/emitter/EventEmitter';
21
19
 
22
- export const SharedEventEmitter: EventEmitter = new Emitter();
20
+ export const SharedEventEmitter: EventEmitter = new EventEmitter();
@@ -123,7 +123,7 @@ export interface GAMBannerAdProps extends Omit<BannerAdProps, 'size'> {
123
123
  *
124
124
  * Inventory must be available for the banner sizes specified, otherwise a no-fill error will be sent to `onAdFailedToLoad`.
125
125
  */
126
- sizes: typeof GAMBannerAdSize[keyof typeof GAMBannerAdSize][] | string[];
126
+ sizes: (typeof GAMBannerAdSize)[keyof typeof GAMBannerAdSize][] | string[];
127
127
 
128
128
  /**
129
129
  * Whether to enable the manual impression counting.
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  // Generated by genversion.
2
- export const version = '13.6.0';
2
+ export const version = '14.0.0';