react-native-google-mobile-ads 4.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 (373) hide show
  1. package/LICENSE +32 -0
  2. package/README.md +65 -0
  3. package/RNGoogleMobileAds.podspec +42 -0
  4. package/__tests__/consent.test.ts +25 -0
  5. package/__tests__/googleMobileAds.test.ts +63 -0
  6. package/__tests__/interstitial.test.ts +53 -0
  7. package/__tests__/requestOptions.test.tsx +4 -0
  8. package/__tests__/rewarded.test.tsx +4 -0
  9. package/__tests__/showOptions.test.tsx +4 -0
  10. package/android/.editorconfig +10 -0
  11. package/android/app-json.gradle +69 -0
  12. package/android/build.gradle +98 -0
  13. package/android/lint.xml +5 -0
  14. package/android/settings.gradle +1 -0
  15. package/android/src/main/AndroidManifest.xml +17 -0
  16. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeAppModule.java +169 -0
  17. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsAppOpenModule.java +161 -0
  18. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsBannerAdViewManager.java +209 -0
  19. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsCommon.java +256 -0
  20. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsConsentModule.java +226 -0
  21. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsEvent.java +72 -0
  22. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsInterstitialModule.java +159 -0
  23. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsModule.java +143 -0
  24. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsPackage.java +48 -0
  25. package/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsRewardedModule.java +177 -0
  26. package/android/src/main/java/io/invertase/googlemobileads/common/RCTConvert.java +111 -0
  27. package/android/src/main/java/io/invertase/googlemobileads/common/ReactNativeApp.java +34 -0
  28. package/android/src/main/java/io/invertase/googlemobileads/common/ReactNativeEvent.java +41 -0
  29. package/android/src/main/java/io/invertase/googlemobileads/common/ReactNativeEventEmitter.java +150 -0
  30. package/android/src/main/java/io/invertase/googlemobileads/common/ReactNativeInitProvider.java +77 -0
  31. package/android/src/main/java/io/invertase/googlemobileads/common/ReactNativeJSON.java +107 -0
  32. package/android/src/main/java/io/invertase/googlemobileads/common/ReactNativeMeta.java +92 -0
  33. package/android/src/main/java/io/invertase/googlemobileads/common/ReactNativeModule.java +96 -0
  34. package/android/src/main/java/io/invertase/googlemobileads/common/ReactNativePreferences.java +86 -0
  35. package/android/src/main/java/io/invertase/googlemobileads/common/SharedUtils.java +427 -0
  36. package/android/src/main/java/io/invertase/googlemobileads/common/TaskExecutorService.java +124 -0
  37. package/android/src/main/java/io/invertase/googlemobileads/interfaces/ContextProvider.java +30 -0
  38. package/android/src/main/java/io/invertase/googlemobileads/interfaces/NativeError.java +28 -0
  39. package/android/src/main/java/io/invertase/googlemobileads/interfaces/NativeEvent.java +26 -0
  40. package/babel.config.js +18 -0
  41. package/docs/displaying-ads.mdx +319 -0
  42. package/docs/european-user-consent.mdx +258 -0
  43. package/docs/img/logo_admob_192px.svg +19 -0
  44. package/docs/index.mdx +168 -0
  45. package/docs.json +9 -0
  46. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsAppOpenModule.h +29 -0
  47. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsAppOpenModule.m +98 -0
  48. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsBannerViewManager.h +23 -0
  49. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsBannerViewManager.m +153 -0
  50. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsCommon.h +60 -0
  51. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsCommon.m +201 -0
  52. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsConsentModule.h +26 -0
  53. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsConsentModule.m +179 -0
  54. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenContentDelegate.h +32 -0
  55. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenContentDelegate.m +57 -0
  56. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsInterstitialModule.h +25 -0
  57. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsInterstitialModule.m +124 -0
  58. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsModule.h +24 -0
  59. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsModule.m +104 -0
  60. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsRewardedModule.h +25 -0
  61. package/ios/RNGoogleMobileAds/RNGoogleMobileAdsRewardedModule.m +173 -0
  62. package/ios/RNGoogleMobileAds/common/RNAppModule.h +24 -0
  63. package/ios/RNGoogleMobileAds/common/RNAppModule.m +158 -0
  64. package/ios/RNGoogleMobileAds/common/RNJSON.h +34 -0
  65. package/ios/RNGoogleMobileAds/common/RNJSON.m +93 -0
  66. package/ios/RNGoogleMobileAds/common/RNMeta.h +30 -0
  67. package/ios/RNGoogleMobileAds/common/RNMeta.m +61 -0
  68. package/ios/RNGoogleMobileAds/common/RNPreferences.h +44 -0
  69. package/ios/RNGoogleMobileAds/common/RNPreferences.m +94 -0
  70. package/ios/RNGoogleMobileAds/common/RNRCTEventEmitter.h +73 -0
  71. package/ios/RNGoogleMobileAds/common/RNRCTEventEmitter.m +150 -0
  72. package/ios/RNGoogleMobileAds/common/RNSharedUtils.h +48 -0
  73. package/ios/RNGoogleMobileAds/common/RNSharedUtils.m +56 -0
  74. package/ios/RNGoogleMobileAds.xcodeproj/project.pbxproj +377 -0
  75. package/ios/RNGoogleMobileAds.xcodeproj/xcshareddata/IDETemplateMacros.plist +24 -0
  76. package/ios_config.sh +140 -0
  77. package/jest.config.js +6 -0
  78. package/jest.setup.ts +29 -0
  79. package/lib/commonjs/AdEventType.js +34 -0
  80. package/lib/commonjs/AdEventType.js.map +1 -0
  81. package/lib/commonjs/AdsConsent.js +160 -0
  82. package/lib/commonjs/AdsConsent.js.map +1 -0
  83. package/lib/commonjs/AdsConsentDebugGeography.js +38 -0
  84. package/lib/commonjs/AdsConsentDebugGeography.js.map +1 -0
  85. package/lib/commonjs/AdsConsentStatus.js +36 -0
  86. package/lib/commonjs/AdsConsentStatus.js.map +1 -0
  87. package/lib/commonjs/BannerAdSize.js +38 -0
  88. package/lib/commonjs/BannerAdSize.js.map +1 -0
  89. package/lib/commonjs/MaxAdContentRating.js +33 -0
  90. package/lib/commonjs/MaxAdContentRating.js.map +1 -0
  91. package/lib/commonjs/MobileAds.js +67 -0
  92. package/lib/commonjs/MobileAds.js.map +1 -0
  93. package/lib/commonjs/RewardedAdEventType.js +31 -0
  94. package/lib/commonjs/RewardedAdEventType.js.map +1 -0
  95. package/lib/commonjs/TestIds.js +47 -0
  96. package/lib/commonjs/TestIds.js.map +1 -0
  97. package/lib/commonjs/ads/AppOpenAd.js +96 -0
  98. package/lib/commonjs/ads/AppOpenAd.js.map +1 -0
  99. package/lib/commonjs/ads/BannerAd.js +128 -0
  100. package/lib/commonjs/ads/BannerAd.js.map +1 -0
  101. package/lib/commonjs/ads/InterstitialAd.js +163 -0
  102. package/lib/commonjs/ads/InterstitialAd.js.map +1 -0
  103. package/lib/commonjs/ads/MobileAd.js +90 -0
  104. package/lib/commonjs/ads/MobileAd.js.map +1 -0
  105. package/lib/commonjs/ads/RewardedAd.js +169 -0
  106. package/lib/commonjs/ads/RewardedAd.js.map +1 -0
  107. package/lib/commonjs/common/Base64.js +121 -0
  108. package/lib/commonjs/common/Base64.js.map +1 -0
  109. package/lib/commonjs/common/MutatableParams.js +46 -0
  110. package/lib/commonjs/common/MutatableParams.js.map +1 -0
  111. package/lib/commonjs/common/ReferenceBase.js +59 -0
  112. package/lib/commonjs/common/ReferenceBase.js.map +1 -0
  113. package/lib/commonjs/common/deeps.js +101 -0
  114. package/lib/commonjs/common/deeps.js.map +1 -0
  115. package/lib/commonjs/common/id.js +82 -0
  116. package/lib/commonjs/common/id.js.map +1 -0
  117. package/lib/commonjs/common/index.js +212 -0
  118. package/lib/commonjs/common/index.js.map +1 -0
  119. package/lib/commonjs/common/path.js +144 -0
  120. package/lib/commonjs/common/path.js.map +1 -0
  121. package/lib/commonjs/common/promise.js +70 -0
  122. package/lib/commonjs/common/promise.js.map +1 -0
  123. package/lib/commonjs/common/serialize.js +52 -0
  124. package/lib/commonjs/common/serialize.js.map +1 -0
  125. package/lib/commonjs/common/validate.js +239 -0
  126. package/lib/commonjs/common/validate.js.map +1 -0
  127. package/lib/commonjs/declarations.d.js +2 -0
  128. package/lib/commonjs/declarations.d.js.map +1 -0
  129. package/lib/commonjs/index.js +143 -0
  130. package/lib/commonjs/index.js.map +1 -0
  131. package/lib/commonjs/internal/GoogleMobileAdsNativeEventEmitter.js +76 -0
  132. package/lib/commonjs/internal/GoogleMobileAdsNativeEventEmitter.js.map +1 -0
  133. package/lib/commonjs/internal/Module.js +60 -0
  134. package/lib/commonjs/internal/Module.js.map +1 -0
  135. package/lib/commonjs/internal/NativeError.js +70 -0
  136. package/lib/commonjs/internal/NativeError.js.map +1 -0
  137. package/lib/commonjs/internal/SharedEventEmitter.js +31 -0
  138. package/lib/commonjs/internal/SharedEventEmitter.js.map +1 -0
  139. package/lib/commonjs/internal/constants.js +30 -0
  140. package/lib/commonjs/internal/constants.js.map +1 -0
  141. package/lib/commonjs/internal/index.js +49 -0
  142. package/lib/commonjs/internal/index.js.map +1 -0
  143. package/lib/commonjs/internal/registry/nativeModule.js +231 -0
  144. package/lib/commonjs/internal/registry/nativeModule.js.map +1 -0
  145. package/lib/commonjs/types/AdEventListener.js +6 -0
  146. package/lib/commonjs/types/AdEventListener.js.map +1 -0
  147. package/lib/commonjs/types/AdShowOptions.js +2 -0
  148. package/lib/commonjs/types/AdShowOptions.js.map +1 -0
  149. package/lib/commonjs/types/AdapterStatus.js +18 -0
  150. package/lib/commonjs/types/AdapterStatus.js.map +1 -0
  151. package/lib/commonjs/types/AdsConsent.interface.js +6 -0
  152. package/lib/commonjs/types/AdsConsent.interface.js.map +1 -0
  153. package/lib/commonjs/types/BannerAdProps.js +6 -0
  154. package/lib/commonjs/types/BannerAdProps.js.map +1 -0
  155. package/lib/commonjs/types/GoogleMobileAdsNativeModule.js +6 -0
  156. package/lib/commonjs/types/GoogleMobileAdsNativeModule.js.map +1 -0
  157. package/lib/commonjs/types/MobileAd.interface.js +6 -0
  158. package/lib/commonjs/types/MobileAd.interface.js.map +1 -0
  159. package/lib/commonjs/types/MobileAdsModule.interface.js +6 -0
  160. package/lib/commonjs/types/MobileAdsModule.interface.js.map +1 -0
  161. package/lib/commonjs/types/Module.interface.js +2 -0
  162. package/lib/commonjs/types/Module.interface.js.map +1 -0
  163. package/lib/commonjs/types/RequestConfiguration.js +6 -0
  164. package/lib/commonjs/types/RequestConfiguration.js.map +1 -0
  165. package/lib/commonjs/types/RequestOptions.js +2 -0
  166. package/lib/commonjs/types/RequestOptions.js.map +1 -0
  167. package/lib/commonjs/types/RewardedAdReward.js +2 -0
  168. package/lib/commonjs/types/RewardedAdReward.js.map +1 -0
  169. package/lib/commonjs/validateAdRequestConfiguration.js +69 -0
  170. package/lib/commonjs/validateAdRequestConfiguration.js.map +1 -0
  171. package/lib/commonjs/validateAdRequestOptions.js +158 -0
  172. package/lib/commonjs/validateAdRequestOptions.js.map +1 -0
  173. package/lib/commonjs/validateAdShowOptions.js +47 -0
  174. package/lib/commonjs/validateAdShowOptions.js.map +1 -0
  175. package/lib/commonjs/version.js +10 -0
  176. package/lib/commonjs/version.js.map +1 -0
  177. package/lib/module/AdEventType.js +26 -0
  178. package/lib/module/AdEventType.js.map +1 -0
  179. package/lib/module/AdsConsent.js +148 -0
  180. package/lib/module/AdsConsent.js.map +1 -0
  181. package/lib/module/AdsConsentDebugGeography.js +30 -0
  182. package/lib/module/AdsConsentDebugGeography.js.map +1 -0
  183. package/lib/module/AdsConsentStatus.js +28 -0
  184. package/lib/module/AdsConsentStatus.js.map +1 -0
  185. package/lib/module/BannerAdSize.js +30 -0
  186. package/lib/module/BannerAdSize.js.map +1 -0
  187. package/lib/module/MaxAdContentRating.js +25 -0
  188. package/lib/module/MaxAdContentRating.js.map +1 -0
  189. package/lib/module/MobileAds.js +53 -0
  190. package/lib/module/MobileAds.js.map +1 -0
  191. package/lib/module/RewardedAdEventType.js +23 -0
  192. package/lib/module/RewardedAdEventType.js.map +1 -0
  193. package/lib/module/TestIds.js +38 -0
  194. package/lib/module/TestIds.js.map +1 -0
  195. package/lib/module/ads/AppOpenAd.js +81 -0
  196. package/lib/module/ads/AppOpenAd.js.map +1 -0
  197. package/lib/module/ads/BannerAd.js +108 -0
  198. package/lib/module/ads/BannerAd.js.map +1 -0
  199. package/lib/module/ads/InterstitialAd.js +149 -0
  200. package/lib/module/ads/InterstitialAd.js.map +1 -0
  201. package/lib/module/ads/MobileAd.js +94 -0
  202. package/lib/module/ads/MobileAd.js.map +1 -0
  203. package/lib/module/ads/RewardedAd.js +155 -0
  204. package/lib/module/ads/RewardedAd.js.map +1 -0
  205. package/lib/module/common/Base64.js +106 -0
  206. package/lib/module/common/Base64.js.map +1 -0
  207. package/lib/module/common/MutatableParams.js +52 -0
  208. package/lib/module/common/MutatableParams.js.map +1 -0
  209. package/lib/module/common/ReferenceBase.js +50 -0
  210. package/lib/module/common/ReferenceBase.js.map +1 -0
  211. package/lib/module/common/deeps.js +91 -0
  212. package/lib/module/common/deeps.js.map +1 -0
  213. package/lib/module/common/id.js +74 -0
  214. package/lib/module/common/id.js.map +1 -0
  215. package/lib/module/common/index.js +109 -0
  216. package/lib/module/common/index.js.map +1 -0
  217. package/lib/module/common/path.js +120 -0
  218. package/lib/module/common/path.js.map +1 -0
  219. package/lib/module/common/promise.js +60 -0
  220. package/lib/module/common/promise.js.map +1 -0
  221. package/lib/module/common/serialize.js +41 -0
  222. package/lib/module/common/serialize.js.map +1 -0
  223. package/lib/module/common/validate.js +197 -0
  224. package/lib/module/common/validate.js.map +1 -0
  225. package/lib/module/declarations.d.js +2 -0
  226. package/lib/module/declarations.d.js.map +1 -0
  227. package/lib/module/index.js +33 -0
  228. package/lib/module/index.js.map +1 -0
  229. package/lib/module/internal/GoogleMobileAdsNativeEventEmitter.js +83 -0
  230. package/lib/module/internal/GoogleMobileAdsNativeEventEmitter.js.map +1 -0
  231. package/lib/module/internal/Module.js +64 -0
  232. package/lib/module/internal/Module.js.map +1 -0
  233. package/lib/module/internal/NativeError.js +61 -0
  234. package/lib/module/internal/NativeError.js.map +1 -0
  235. package/lib/module/internal/SharedEventEmitter.js +20 -0
  236. package/lib/module/internal/SharedEventEmitter.js.map +1 -0
  237. package/lib/module/internal/constants.js +20 -0
  238. package/lib/module/internal/constants.js.map +1 -0
  239. package/lib/module/internal/index.js +21 -0
  240. package/lib/module/internal/index.js.map +1 -0
  241. package/lib/module/internal/registry/nativeModule.js +215 -0
  242. package/lib/module/internal/registry/nativeModule.js.map +1 -0
  243. package/lib/module/types/AdEventListener.js +2 -0
  244. package/lib/module/types/AdEventListener.js.map +1 -0
  245. package/lib/module/types/AdShowOptions.js +2 -0
  246. package/lib/module/types/AdShowOptions.js.map +1 -0
  247. package/lib/module/types/AdapterStatus.js +10 -0
  248. package/lib/module/types/AdapterStatus.js.map +1 -0
  249. package/lib/module/types/AdsConsent.interface.js +2 -0
  250. package/lib/module/types/AdsConsent.interface.js.map +1 -0
  251. package/lib/module/types/BannerAdProps.js +2 -0
  252. package/lib/module/types/BannerAdProps.js.map +1 -0
  253. package/lib/module/types/GoogleMobileAdsNativeModule.js +2 -0
  254. package/lib/module/types/GoogleMobileAdsNativeModule.js.map +1 -0
  255. package/lib/module/types/MobileAd.interface.js +2 -0
  256. package/lib/module/types/MobileAd.interface.js.map +1 -0
  257. package/lib/module/types/MobileAdsModule.interface.js +2 -0
  258. package/lib/module/types/MobileAdsModule.interface.js.map +1 -0
  259. package/lib/module/types/Module.interface.js +2 -0
  260. package/lib/module/types/Module.interface.js.map +1 -0
  261. package/lib/module/types/RequestConfiguration.js +2 -0
  262. package/lib/module/types/RequestConfiguration.js.map +1 -0
  263. package/lib/module/types/RequestOptions.js +2 -0
  264. package/lib/module/types/RequestOptions.js.map +1 -0
  265. package/lib/module/types/RewardedAdReward.js +2 -0
  266. package/lib/module/types/RewardedAdReward.js.map +1 -0
  267. package/lib/module/validateAdRequestConfiguration.js +60 -0
  268. package/lib/module/validateAdRequestConfiguration.js.map +1 -0
  269. package/lib/module/validateAdRequestOptions.js +150 -0
  270. package/lib/module/validateAdRequestOptions.js.map +1 -0
  271. package/lib/module/validateAdShowOptions.js +39 -0
  272. package/lib/module/validateAdShowOptions.js.map +1 -0
  273. package/lib/module/version.js +3 -0
  274. package/lib/module/version.js.map +1 -0
  275. package/lib/typescript/AdEventType.d.ts +47 -0
  276. package/lib/typescript/AdsConsent.d.ts +2 -0
  277. package/lib/typescript/AdsConsentDebugGeography.d.ts +19 -0
  278. package/lib/typescript/AdsConsentStatus.d.ts +17 -0
  279. package/lib/typescript/BannerAdSize.d.ts +34 -0
  280. package/lib/typescript/MaxAdContentRating.d.ts +18 -0
  281. package/lib/typescript/MobileAds.d.ts +11 -0
  282. package/lib/typescript/RewardedAdEventType.d.ts +46 -0
  283. package/lib/typescript/TestIds.d.ts +6 -0
  284. package/lib/typescript/ads/AppOpenAd.d.ts +11 -0
  285. package/lib/typescript/ads/BannerAd.d.ts +3 -0
  286. package/lib/typescript/ads/InterstitialAd.d.ts +78 -0
  287. package/lib/typescript/ads/MobileAd.d.ts +32 -0
  288. package/lib/typescript/ads/RewardedAd.d.ts +84 -0
  289. package/lib/typescript/common/Base64.d.ts +14 -0
  290. package/lib/typescript/common/MutatableParams.d.ts +9 -0
  291. package/lib/typescript/common/ReferenceBase.d.ts +11 -0
  292. package/lib/typescript/common/deeps.d.ts +18 -0
  293. package/lib/typescript/common/id.d.ts +11 -0
  294. package/lib/typescript/common/index.d.ts +28 -0
  295. package/lib/typescript/common/path.d.ts +43 -0
  296. package/lib/typescript/common/promise.d.ts +13 -0
  297. package/lib/typescript/common/serialize.d.ts +5 -0
  298. package/lib/typescript/common/validate.d.ts +90 -0
  299. package/lib/typescript/index.d.ts +14 -0
  300. package/lib/typescript/internal/GoogleMobileAdsNativeEventEmitter.d.ts +12 -0
  301. package/lib/typescript/internal/Module.d.ts +13 -0
  302. package/lib/typescript/internal/NativeError.d.ts +26 -0
  303. package/lib/typescript/internal/SharedEventEmitter.d.ts +2 -0
  304. package/lib/typescript/internal/constants.d.ts +3 -0
  305. package/lib/typescript/internal/index.d.ts +4 -0
  306. package/lib/typescript/internal/registry/nativeModule.d.ts +15 -0
  307. package/lib/typescript/types/AdEventListener.d.ts +11 -0
  308. package/lib/typescript/types/AdShowOptions.d.ts +12 -0
  309. package/lib/typescript/types/AdapterStatus.d.ts +18 -0
  310. package/lib/typescript/types/AdsConsent.interface.d.ts +286 -0
  311. package/lib/typescript/types/BannerAdProps.d.ts +66 -0
  312. package/lib/typescript/types/GoogleMobileAdsNativeModule.d.ts +14 -0
  313. package/lib/typescript/types/MobileAd.interface.d.ts +64 -0
  314. package/lib/typescript/types/MobileAdsModule.interface.d.ts +38 -0
  315. package/lib/typescript/types/Module.interface.d.ts +14 -0
  316. package/lib/typescript/types/RequestConfiguration.d.ts +36 -0
  317. package/lib/typescript/types/RequestOptions.d.ts +106 -0
  318. package/lib/typescript/types/RewardedAdReward.d.ts +13 -0
  319. package/lib/typescript/validateAdRequestConfiguration.d.ts +2 -0
  320. package/lib/typescript/validateAdRequestOptions.d.ts +2 -0
  321. package/lib/typescript/validateAdShowOptions.d.ts +2 -0
  322. package/lib/typescript/version.d.ts +1 -0
  323. package/package.json +143 -0
  324. package/react-native.config.js +19 -0
  325. package/src/AdEventType.ts +68 -0
  326. package/src/AdsConsent.ts +191 -0
  327. package/src/AdsConsentDebugGeography.ts +38 -0
  328. package/src/AdsConsentStatus.ts +36 -0
  329. package/src/BannerAdSize.ts +59 -0
  330. package/src/MaxAdContentRating.ts +38 -0
  331. package/src/MobileAds.ts +84 -0
  332. package/src/RewardedAdEventType.ts +64 -0
  333. package/src/TestIds.ts +39 -0
  334. package/src/ads/AppOpenAd.ts +85 -0
  335. package/src/ads/BannerAd.tsx +126 -0
  336. package/src/ads/InterstitialAd.ts +156 -0
  337. package/src/ads/MobileAd.ts +101 -0
  338. package/src/ads/RewardedAd.ts +161 -0
  339. package/src/common/Base64.ts +114 -0
  340. package/src/common/MutatableParams.ts +50 -0
  341. package/src/common/ReferenceBase.ts +45 -0
  342. package/src/common/deeps.ts +88 -0
  343. package/src/common/id.ts +74 -0
  344. package/src/common/index.ts +103 -0
  345. package/src/common/path.ts +114 -0
  346. package/src/common/promise.ts +66 -0
  347. package/src/common/serialize.ts +43 -0
  348. package/src/common/validate.ts +205 -0
  349. package/src/declarations.d.ts +3 -0
  350. package/src/index.ts +35 -0
  351. package/src/internal/GoogleMobileAdsNativeEventEmitter.ts +81 -0
  352. package/src/internal/Module.ts +58 -0
  353. package/src/internal/NativeError.ts +56 -0
  354. package/src/internal/SharedEventEmitter.ts +22 -0
  355. package/src/internal/constants.ts +43 -0
  356. package/src/internal/index.ts +21 -0
  357. package/src/internal/registry/nativeModule.ts +226 -0
  358. package/src/types/AdEventListener.ts +16 -0
  359. package/src/types/AdShowOptions.ts +12 -0
  360. package/src/types/AdapterStatus.ts +20 -0
  361. package/src/types/AdsConsent.interface.ts +306 -0
  362. package/src/types/BannerAdProps.ts +73 -0
  363. package/src/types/GoogleMobileAdsNativeModule.ts +15 -0
  364. package/src/types/MobileAd.interface.ts +69 -0
  365. package/src/types/MobileAdsModule.interface.ts +43 -0
  366. package/src/types/Module.interface.ts +16 -0
  367. package/src/types/RequestConfiguration.ts +40 -0
  368. package/src/types/RequestOptions.ts +113 -0
  369. package/src/types/RewardedAdReward.ts +14 -0
  370. package/src/validateAdRequestConfiguration.ts +71 -0
  371. package/src/validateAdRequestOptions.ts +168 -0
  372. package/src/validateAdShowOptions.ts +41 -0
  373. package/src/version.ts +2 -0
@@ -0,0 +1,161 @@
1
+ /*
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ import { isFunction, isString } from '../common';
19
+ import { MobileAds } from '../MobileAds';
20
+ import { validateAdRequestOptions } from '../validateAdRequestOptions';
21
+ import { validateAdShowOptions } from '../validateAdShowOptions';
22
+ import { MobileAd } from './MobileAd';
23
+ import { AdEventListener } from '../types/AdEventListener';
24
+ import { AdShowOptions } from '../types/AdShowOptions';
25
+ import { RequestOptions } from '../types/RequestOptions';
26
+ import { MobileAdInterface } from '../types/MobileAd.interface';
27
+
28
+ let _rewardedRequest = 0;
29
+
30
+ /**
31
+ * A class for interacting and showing Rewarded Ads.
32
+ *
33
+ * An Rewarded advert can be pre-loaded and shown at a suitable point in your apps flow, such as at the end of a level
34
+ * in a game. The content of a rewarded advert can be controlled via your Google Mobile Ads dashboard. Typically users are rewarded
35
+ * after completing a specific advert action (e.g. watching a video or submitting an option via an interactive form).
36
+ * Events (such as the user earning a reward or closing a rewarded advert early) are sent back for you to handle accordingly
37
+ * within your application.
38
+ *
39
+ * #### Example
40
+ *
41
+ * First create a new Rewarded instance, passing in your Ad Unit ID from the Google Mobile Ads configuration console, and any additional
42
+ * request options. The example below will present a test advert, and only request a non-personalized ad.
43
+ *
44
+ * ```js
45
+ * import { RewardedAd, TestIds } from 'react-native-google-mobile-ads';
46
+ *
47
+ * const rewarded = RewardedAd.createForAdRequest(TestIds.REWARDED, {
48
+ * requestNonPersonalizedAdsOnly: true,
49
+ * });
50
+ * ```
51
+ *
52
+ * Each advert needs to be loaded from Google Mobile Ads before being shown. It is recommended this is performed before the user
53
+ * reaches the checkpoint to show the advert, so it's ready to go. Before loading the advert, we need to setup
54
+ * event listeners to listen for updates from Google Mobile Ads, such as advert loaded or failed to load.
55
+ *
56
+ * Event types match the `AdEventType` or `RewardedAdEventType` interface. The potential user reward for rewarded
57
+ * adverts are passed back to the event handler on advert load and when the user earns the reward.
58
+ *
59
+ * ```js
60
+ * import { RewardedAdEventType } from 'react-native-google-mobile-ads';
61
+ *
62
+ * rewarded.onAdEvent((type, error, reward) => {
63
+ * if (type === RewardedAdEventType.LOADED) {
64
+ * rewarded.show();
65
+ * }
66
+ * if (type === RewardedAdEventType.EARNED_REWARD) {
67
+ * console.log('User earned reward of ', reward);
68
+ * }
69
+ * });
70
+ *
71
+ * rewarded.load();
72
+ * ```
73
+ *
74
+ * The rewarded advert will be presented to the user, and several more events can be triggered such as the user clicking the
75
+ * advert, closing it or completing the action.
76
+ */
77
+ export class RewardedAd extends MobileAd implements MobileAdInterface {
78
+ /**
79
+ * Creates a new RewardedAd instance.
80
+ *
81
+ * #### Example
82
+ *
83
+ * ```js
84
+ * import { RewardedAd, RewardedAdEventType, TestIds } from 'react-native-google-mobile-ads';
85
+ *
86
+ * const rewardedAd = await RewardedAd.createForAdRequest(TestIds.REWARDED, {
87
+ * requestAgent: 'CoolAds',
88
+ * });
89
+ *
90
+ * rewardedAd.onAdEvent((type, error, data) => {
91
+ * console.log('New event: ', type, error);
92
+ *
93
+ * if (type === RewardedAdEventType.LOADED) {
94
+ * rewardedAd.show();
95
+ * }
96
+ * });
97
+ *
98
+ * rewardedAd.load();
99
+ * ```
100
+ *
101
+ * @param adUnitId The Ad Unit ID for the Rewarded Ad. You can find this on your Google Mobile Ads dashboard.
102
+ * @param requestOptions Optional RequestOptions used to load the ad.
103
+ */
104
+ static createForAdRequest(adUnitId: string, requestOptions?: RequestOptions): RewardedAd {
105
+ if (!isString(adUnitId)) {
106
+ throw new Error("RewardedAd.createForAdRequest(*) 'adUnitId' expected an string value.");
107
+ }
108
+
109
+ let options = {};
110
+ try {
111
+ options = validateAdRequestOptions(requestOptions);
112
+ } catch (e) {
113
+ if (e instanceof Error) {
114
+ throw new Error(`RewardedAd.createForAdRequest(_, *) ${e.message}.`);
115
+ }
116
+ }
117
+
118
+ const requestId = _rewardedRequest++;
119
+ return new RewardedAd('rewarded', MobileAds(), requestId, adUnitId, options);
120
+ }
121
+
122
+ load() {
123
+ // Prevent multiple load calls
124
+ if (this._loaded || this._isLoadCalled) {
125
+ return;
126
+ }
127
+
128
+ this._isLoadCalled = true;
129
+ this._googleMobileAds.native.rewardedLoad(
130
+ this._requestId,
131
+ this._adUnitId,
132
+ this._requestOptions,
133
+ );
134
+ }
135
+
136
+ onAdEvent(handler: AdEventListener) {
137
+ if (!isFunction(handler)) {
138
+ throw new Error("RewardedAd.onAdEvent(*) 'handler' expected a function.");
139
+ }
140
+
141
+ return this._setAdEventHandler(handler);
142
+ }
143
+
144
+ show(showOptions?: AdShowOptions) {
145
+ if (!this._loaded) {
146
+ throw new Error(
147
+ 'RewardedAd.show() The requested RewardedAd has not loaded and could not be shown.',
148
+ );
149
+ }
150
+
151
+ let options;
152
+ try {
153
+ options = validateAdShowOptions(showOptions);
154
+ } catch (e) {
155
+ if (e instanceof Error) {
156
+ throw new Error(`RewardedAd.show(*) ${e.message}.`);
157
+ }
158
+ }
159
+ return this._googleMobileAds.native.rewardedShow(this._requestId, this._adUnitId, options);
160
+ }
161
+ }
@@ -0,0 +1,114 @@
1
+ /* eslint-disable no-bitwise */
2
+ /* global Blob, FileReader */
3
+ /*
4
+ * Copyright (c) 2016-present Invertase Limited & Contributors
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this library except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ *
18
+ */
19
+
20
+ import binaryToBase64 from 'react-native/Libraries/Utilities/binaryToBase64';
21
+ import { promiseDefer } from './promise';
22
+
23
+ const CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
24
+
25
+ /**
26
+ * window.btoa
27
+ */
28
+ export function btoa(input: string) {
29
+ let map;
30
+ let i = 0;
31
+ let block = 0;
32
+ let output = '';
33
+
34
+ for (
35
+ block = 0, i = 0, map = CHARS;
36
+ input.charAt(i | 0) || ((map = '='), i % 1);
37
+ output += map.charAt(63 & (block >> (8 - (i % 1) * 8)))
38
+ ) {
39
+ const charCode = input.charCodeAt((i += 3 / 4));
40
+
41
+ if (charCode > 0xff) {
42
+ throw new Error(
43
+ "'RNFirebase.Base64.btoa' failed: The string to be encoded contains characters outside of the Latin1 range.",
44
+ );
45
+ }
46
+
47
+ block = (block << 8) | charCode;
48
+ }
49
+
50
+ return output;
51
+ }
52
+
53
+ /**
54
+ * window.atob
55
+ */
56
+ export function atob(input: string) {
57
+ let i = 0;
58
+ let bc = 0;
59
+ let bs = 0;
60
+ let buffer;
61
+ let output = '';
62
+
63
+ const str = input.replace(/[=]+$/, '');
64
+
65
+ if (str.length % 4 === 1) {
66
+ throw new Error(
67
+ "'RNFirebase.Base64.atob' failed: The string to be decoded is not correctly encoded.",
68
+ );
69
+ }
70
+
71
+ for (
72
+ bc = 0, bs = 0, i = 0;
73
+ (buffer = str.charAt(i++));
74
+ ~buffer && ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4)
75
+ ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))
76
+ : 0
77
+ ) {
78
+ buffer = CHARS.indexOf(buffer);
79
+ }
80
+
81
+ return output;
82
+ }
83
+
84
+ /**
85
+ * Converts a Blob, ArrayBuffer or Uint8Array to a base64 string.
86
+ */
87
+ export function fromData(data: Blob | ArrayBuffer | Uint8Array) {
88
+ if (data instanceof Blob) {
89
+ const fileReader = new FileReader();
90
+ const { resolve, reject, promise } = promiseDefer();
91
+
92
+ fileReader.readAsDataURL(data);
93
+
94
+ fileReader.onloadend = function onloadend() {
95
+ resolve({ string: fileReader.result, format: 'data_url' });
96
+ };
97
+
98
+ fileReader.onerror = function onerror(event) {
99
+ fileReader.abort();
100
+ reject(event);
101
+ };
102
+
103
+ return promise;
104
+ }
105
+
106
+ if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
107
+ return Promise.resolve({
108
+ string: binaryToBase64(data),
109
+ format: 'base64',
110
+ });
111
+ }
112
+
113
+ throw new Error("'RNFirebase.Base64.fromData' failed: Unknown data type.");
114
+ }
@@ -0,0 +1,50 @@
1
+ /*
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ import { deepGet, deepSet } from './deeps';
19
+
20
+ export class MutatableParams {
21
+ _mutatableParams: Record<string, unknown>;
22
+ _parentInstance: MutatableParams;
23
+
24
+ constructor(parentInstance: MutatableParams) {
25
+ if (parentInstance) {
26
+ this._mutatableParams = parentInstance._mutatableParams;
27
+ this._parentInstance = parentInstance;
28
+ } else {
29
+ this._mutatableParams = {};
30
+ this._parentInstance = this;
31
+ }
32
+ }
33
+
34
+ set(param: string, value: unknown) {
35
+ deepSet(this._mutatableParams, param, value);
36
+ return this._parentInstance;
37
+ }
38
+
39
+ get(param: string) {
40
+ return deepGet(this._mutatableParams, param, '.');
41
+ }
42
+
43
+ toJSON() {
44
+ return Object.assign({}, this._mutatableParams);
45
+ }
46
+
47
+ validate() {
48
+ // do nothing
49
+ }
50
+ }
@@ -0,0 +1,45 @@
1
+ /*
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ export class ReferenceBase {
19
+ path: string;
20
+
21
+ constructor(_path: string) {
22
+ let path = _path;
23
+
24
+ if (path) {
25
+ path = path.length > 1 && path.endsWith('/') ? path.substring(0, path.length - 1) : path;
26
+ if (path.startsWith('/') && path.length > 1) {
27
+ path = path.substring(1, path.length);
28
+ }
29
+ } else {
30
+ path = '/';
31
+ }
32
+
33
+ this.path = path;
34
+ }
35
+
36
+ /**
37
+ * The last part of a Reference's path (after the last '/')
38
+ * The key of a root Reference is null.
39
+ * @type {String}
40
+ * {@link https://firebase.google.com/docs/reference/js/firebase.database.Reference#key}
41
+ */
42
+ get key() {
43
+ return this.path === '/' ? null : this.path.substring(this.path.lastIndexOf('/') + 1);
44
+ }
45
+ }
@@ -0,0 +1,88 @@
1
+ /*
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ import { isArray, isObject } from './validate';
19
+
20
+ /**
21
+ * Deep get a value from an object.
22
+ * @website https://github.com/Salakar/deeps
23
+ * @param object
24
+ * @param path
25
+ * @param joiner
26
+ * @returns {*}
27
+ */
28
+ export function deepGet(object: Record<string, unknown>, path: string, joiner = '/') {
29
+ if (!isObject(object) && !Array.isArray(object)) {
30
+ return undefined;
31
+ }
32
+ const keys = path.split(joiner);
33
+
34
+ let i = 0;
35
+ let value;
36
+ const len = keys.length;
37
+
38
+ while (i < len) {
39
+ const key = keys[i++];
40
+ if (!object || !Object.hasOwnProperty.call(object, key)) {
41
+ return undefined;
42
+ }
43
+ value = object[key];
44
+ }
45
+
46
+ return value;
47
+ }
48
+
49
+ /**
50
+ * Deep set a value
51
+ * @param object
52
+ * @param path
53
+ * @param value
54
+ * @param initPaths
55
+ * @param joiner
56
+ */
57
+ export function deepSet(
58
+ object: Record<string, unknown>,
59
+ path: string,
60
+ value: unknown,
61
+ initPaths = true,
62
+ joiner = '.',
63
+ ) {
64
+ if (!isObject(object)) {
65
+ return false;
66
+ }
67
+ const keys = path.split(joiner);
68
+
69
+ let i = 0;
70
+ let _object = object;
71
+ const len = keys.length - 1;
72
+
73
+ while (i < len) {
74
+ const key = keys[i++];
75
+ if (initPaths && !Object.hasOwnProperty.call(object, key)) {
76
+ _object[key] = {};
77
+ }
78
+ _object = _object[key] as Record<string, unknown>;
79
+ }
80
+
81
+ if (isObject(_object) || (isArray(_object) && !Number.isNaN(keys[i]))) {
82
+ _object[keys[i]] = value;
83
+ } else {
84
+ return false;
85
+ }
86
+
87
+ return true;
88
+ }
@@ -0,0 +1,74 @@
1
+ const PUSH_CHARS = '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';
2
+
3
+ const AUTO_ID_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
4
+
5
+ // timestamp of last push, used to prevent local collisions if you push twice in one ms.
6
+ let lastPushTime = 0;
7
+
8
+ // we generate 72-bits of randomness which get turned into 12 characters and appended to the
9
+ // timestamp to prevent collisions with other clients. We store the last characters we
10
+ // generated because in the event of a collision, we'll use those same characters except
11
+ // "incremented" by one.
12
+ const lastRandChars: number[] = [];
13
+
14
+ /**
15
+ * Generate a firebase id - for use with ref().push(val, cb) - e.g. -KXMr7k2tXUFQqiaZRY4'
16
+ * @param serverTimeOffset - pass in server time offset from native side
17
+ * @returns {string}
18
+ */
19
+ export function generateDatabaseId(serverTimeOffset = 0) {
20
+ const timeStampChars = new Array(8);
21
+ let now = new Date().getTime() + serverTimeOffset;
22
+ const duplicateTime = now === lastPushTime;
23
+
24
+ lastPushTime = now;
25
+
26
+ for (let i = 7; i >= 0; i -= 1) {
27
+ timeStampChars[i] = PUSH_CHARS.charAt(now % 64);
28
+ now = Math.floor(now / 64);
29
+ }
30
+
31
+ if (now !== 0) {
32
+ throw new Error('We should have converted the entire timestamp.');
33
+ }
34
+
35
+ let id = timeStampChars.join('');
36
+
37
+ if (!duplicateTime) {
38
+ for (let i = 0; i < 12; i += 1) {
39
+ lastRandChars[i] = Math.floor(Math.random() * 64);
40
+ }
41
+ } else {
42
+ // if the timestamp hasn't changed since last push,
43
+ // use the same random number, but increment it by 1.
44
+ let i;
45
+ for (i = 11; i >= 0 && lastRandChars[i] === 63; i -= 1) {
46
+ lastRandChars[i] = 0;
47
+ }
48
+
49
+ lastRandChars[i] += 1;
50
+ }
51
+
52
+ for (let i = 0; i < 12; i++) {
53
+ id += PUSH_CHARS.charAt(lastRandChars[i]);
54
+ }
55
+
56
+ if (id.length !== 20) {
57
+ throw new Error('Length should be 20.');
58
+ }
59
+
60
+ return id;
61
+ }
62
+
63
+ /**
64
+ * Generate a firestore auto id for use with collection/document .add()
65
+ * @return {string}
66
+ */
67
+ export function generateFirestoreId() {
68
+ let autoId = '';
69
+
70
+ for (let i = 0; i < 20; i++) {
71
+ autoId += AUTO_ID_CHARS.charAt(Math.floor(Math.random() * AUTO_ID_CHARS.length));
72
+ }
73
+ return autoId;
74
+ }
@@ -0,0 +1,103 @@
1
+ /*
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ import { Platform } from 'react-native';
19
+ import * as Base64 from './Base64';
20
+ import { isString } from './validate';
21
+
22
+ export * from './id';
23
+ export * from './path';
24
+ export * from './promise';
25
+ export * from './validate';
26
+
27
+ export { Base64 };
28
+ export { ReferenceBase } from './ReferenceBase';
29
+
30
+ export function getDataUrlParts(dataUrlString: string) {
31
+ const isBase64 = dataUrlString.includes(';base64');
32
+ let [mediaType, base64String] = dataUrlString.split(',');
33
+ if (!mediaType || !base64String) {
34
+ return { base64String: undefined, mediaType: undefined };
35
+ }
36
+ mediaType = mediaType.replace('data:', '').replace(';base64', '');
37
+ if (base64String && base64String.includes('%')) {
38
+ base64String = decodeURIComponent(base64String);
39
+ }
40
+ if (!isBase64) {
41
+ base64String = Base64.btoa(base64String);
42
+ }
43
+ return { base64String, mediaType };
44
+ }
45
+
46
+ export function once<T>(fn: () => void, context: unknown): (this: T, ...args: []) => void {
47
+ let onceResult: unknown;
48
+ let ranOnce = false;
49
+
50
+ return function onceInner(...args: []) {
51
+ if (!ranOnce) {
52
+ ranOnce = true;
53
+ onceResult = fn.apply(context || this, args);
54
+ }
55
+
56
+ return onceResult;
57
+ };
58
+ }
59
+
60
+ export function isError(value: unknown) {
61
+ if (Object.prototype.toString.call(value) === '[object Error]') {
62
+ return true;
63
+ }
64
+
65
+ return value instanceof Error;
66
+ }
67
+
68
+ export function hasOwnProperty(target: unknown, property: PropertyKey) {
69
+ return Object.hasOwnProperty.call(target, property);
70
+ }
71
+
72
+ /**
73
+ * Remove a trailing forward slash from a string if it exists
74
+ *
75
+ * @param string
76
+ * @returns {*}
77
+ */
78
+ export function stripTrailingSlash(string: string) {
79
+ if (!isString(string)) {
80
+ return string;
81
+ }
82
+ return string.endsWith('/') ? string.slice(0, -1) : string;
83
+ }
84
+
85
+ export const isIOS = Platform.OS === 'ios';
86
+
87
+ export const isAndroid = Platform.OS === 'android';
88
+
89
+ export function tryJSONParse(string: string) {
90
+ try {
91
+ return string && JSON.parse(string);
92
+ } catch (jsonError) {
93
+ return string;
94
+ }
95
+ }
96
+
97
+ export function tryJSONStringify(data: unknown) {
98
+ try {
99
+ return JSON.stringify(data);
100
+ } catch (jsonError) {
101
+ return null;
102
+ }
103
+ }