From ef5e539df5a4de84bfdb1f5d271e7442f1d784c1 Mon Sep 17 00:00:00 2001 From: Jerome Bonfort Date: Mon, 30 Mar 2026 14:55:45 +0200 Subject: [PATCH] fix: ensure adLoader updates are consistent across platforms - Moved adLoader update logic to ensure it is executed regardless of auto-refresh settings in both iOS and Android implementations. - Updated Banner component to handle bid completion state more effectively, improving error handling and event logging during ad loading. --- .../adversport/rnaps/RNAPSAdLoaderModule.java | 2 +- example/src/Banner.component.tsx | 24 ++++++++++++++++--- ios/RNAPS/RNAPSAdLoaderModule.swift | 2 +- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/adversport/rnaps/RNAPSAdLoaderModule.java b/android/src/main/java/com/adversport/rnaps/RNAPSAdLoaderModule.java index cf903b1..182211c 100644 --- a/android/src/main/java/com/adversport/rnaps/RNAPSAdLoaderModule.java +++ b/android/src/main/java/com/adversport/rnaps/RNAPSAdLoaderModule.java @@ -232,9 +232,9 @@ public void loadAd(int loaderId, String adType, ReadableMap options, Promise pro if (autoRefresh) { adLoader.setAutoRefresh(refreshInterval); - adLoaders.put(loaderId, adLoader); } + adLoaders.put(loaderId, adLoader); adLoader.loadAd(new AdCallback(loaderId, promise)); } diff --git a/example/src/Banner.component.tsx b/example/src/Banner.component.tsx index 02515d2..cbffe12 100644 --- a/example/src/Banner.component.tsx +++ b/example/src/Banner.component.tsx @@ -11,6 +11,7 @@ import { AdLoader, AdLoaderEvent, BannerAdLoaderOptions, + isAdError, TestIds, } from 'react-native-aps'; import { GAMBannerAd, BannerAdSize } from 'react-native-google-mobile-ads'; @@ -27,21 +28,23 @@ export default function BannerDemo() { {} ); const [apsBidError, setApsBidError] = useState(); + const [bidComplete, setBidComplete] = useState(false); const [gamAdLoaded, setGamAdLoaded] = useState(false); const [events, setEvents] = useState([]); const addEvent = (msg: string) => setEvents((prev) => [`${new Date().toLocaleTimeString()} ${msg}`, ...prev]); - const apsBidDone = - Object.keys(apsBidResult).length > 0 || apsBidError !== undefined; + const apsBidDone = bidComplete; const bidSuccess = apsBidDone && !apsBidError; useEffect(() => { + // Events for auto-refresh scenarios const unsubSuccess = adLoader.addListener( AdLoaderEvent.SUCCESS, (result) => { setApsBidResult(result); + setBidComplete(true); addEvent(`APS bid won (${Object.keys(result).length} KVs)`); } ); @@ -49,11 +52,26 @@ export default function BannerDemo() { AdLoaderEvent.FAILURE, (error) => { setApsBidError(error); + setBidComplete(true); addEvent(`APS bid failed (code: ${error.code})`); } ); - adLoader.loadAd(); + adLoader + .loadAd() + .then((result) => { + setApsBidResult(result); + setBidComplete(true); + addEvent(`APS bid won (${Object.keys(result).length} KVs)`); + }) + .catch((error) => { + const adError = isAdError(error) + ? error + : new AdError('unknown', String(error?.message ?? error)); + setApsBidError(adError); + setBidComplete(true); + addEvent(`APS bid failed (code: ${adError.code})`); + }); addEvent('APS bid requested'); return () => { diff --git a/ios/RNAPS/RNAPSAdLoaderModule.swift b/ios/RNAPS/RNAPSAdLoaderModule.swift index 12d2504..65d1bf8 100644 --- a/ios/RNAPS/RNAPSAdLoaderModule.swift +++ b/ios/RNAPS/RNAPSAdLoaderModule.swift @@ -181,9 +181,9 @@ class RNAPSAdLoaderModule: RCTEventEmitter { if (autoRefresh) { adLoader.setAutoRefresh(refreshInterval) - adLoaders.updateValue(adLoader, forKey: loaderId) } + adLoaders.updateValue(adLoader, forKey: loaderId) adLoader.loadAd(AdLoadCallback(adLoaderModule: self, loaderId: loaderId, resolve: resolve, reject: reject)) }