@24jieqi/react-native-brayant-ad 0.1.19 → 0.1.21
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.
- package/android/src/main/java/com/brayantad/dy/banner/BannerAdViewManager.java +1 -1
- package/android/src/main/java/com/brayantad/dy/banner/view/BannerAdView.java +68 -126
- package/android/src/main/res/layout/feed_view.xml +1 -1
- package/ios/PangleAdModule/BannerAdViewManager.m +1 -1
- package/lib/commonjs/dy/component/BannerAd.js +30 -55
- package/lib/commonjs/dy/component/BannerAd.js.map +1 -1
- package/lib/module/dy/component/BannerAd.js +31 -56
- package/lib/module/dy/component/BannerAd.js.map +1 -1
- package/lib/typescript/src/dy/component/BannerAd.d.ts +12 -6
- package/lib/typescript/src/dy/component/BannerAd.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/dy/component/BannerAd.tsx +44 -73
|
@@ -13,7 +13,7 @@ import com.facebook.react.uimanager.annotations.ReactProp;
|
|
|
13
13
|
import java.util.Map;
|
|
14
14
|
|
|
15
15
|
public class BannerAdViewManager extends ViewGroupManager<BannerAdView> {
|
|
16
|
-
public static final String TAG = "
|
|
16
|
+
public static final String TAG = "BannerAdViewManager";
|
|
17
17
|
|
|
18
18
|
@NonNull
|
|
19
19
|
@Override
|
|
@@ -3,19 +3,14 @@ package com.brayantad.dy.banner.view;
|
|
|
3
3
|
import static com.facebook.react.bridge.UiThreadUtil.runOnUiThread;
|
|
4
4
|
|
|
5
5
|
import android.app.Activity;
|
|
6
|
-
import android.util.Log;
|
|
7
6
|
import android.view.View;
|
|
8
7
|
import android.view.ViewGroup;
|
|
9
8
|
import android.widget.RelativeLayout;
|
|
10
9
|
|
|
11
|
-
import androidx.annotation.NonNull;
|
|
12
|
-
|
|
13
10
|
import com.brayantad.R;
|
|
14
11
|
import com.brayantad.dy.DyADCore;
|
|
15
12
|
import com.brayantad.utils.Utils;
|
|
16
13
|
import com.bytedance.sdk.openadsdk.AdSlot;
|
|
17
|
-
import com.bytedance.sdk.openadsdk.DislikeInfo;
|
|
18
|
-
import com.bytedance.sdk.openadsdk.FilterWord;
|
|
19
14
|
import com.bytedance.sdk.openadsdk.TTAdDislike;
|
|
20
15
|
import com.bytedance.sdk.openadsdk.TTAdNative;
|
|
21
16
|
import com.bytedance.sdk.openadsdk.TTNativeExpressAd;
|
|
@@ -25,58 +20,50 @@ import com.facebook.react.bridge.WritableMap;
|
|
|
25
20
|
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
|
26
21
|
|
|
27
22
|
public class BannerAdView extends RelativeLayout {
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
private ReactContext reactContext;
|
|
33
|
-
private String _codeid = "";
|
|
34
|
-
private AdSlot adSlot;
|
|
23
|
+
private Activity mActivity;
|
|
24
|
+
private ReactContext mReactContext;
|
|
25
|
+
private String mCodeId;
|
|
26
|
+
private AdSlot mAdSlot;
|
|
35
27
|
private TTNativeExpressAd mBannerAd;
|
|
36
28
|
|
|
37
|
-
private int
|
|
38
|
-
private int
|
|
29
|
+
private int mExpectedWidth = 0; // 宽度 dp,由外部设置(必填)
|
|
30
|
+
private int mExpectedHeight = 0; // 高度 dp,由外部设置(必填),根据官方文档 Banner 广告高度不能为 0
|
|
31
|
+
private boolean mIsAdLoading = false; // 防止重复加载广告
|
|
39
32
|
|
|
40
33
|
public BannerAdView(ReactContext context) {
|
|
41
34
|
super(context);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
35
|
+
mReactContext = context;
|
|
36
|
+
mActivity = context.getCurrentActivity();
|
|
37
|
+
|
|
45
38
|
inflate(context, R.layout.feed_view, this);
|
|
46
39
|
Utils.setupLayoutHack(this);
|
|
47
40
|
|
|
48
41
|
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
|
|
49
42
|
RelativeLayout.LayoutParams.MATCH_PARENT,
|
|
50
|
-
|
|
43
|
+
mExpectedHeight
|
|
51
44
|
);
|
|
52
45
|
setLayoutParams(params);
|
|
53
|
-
|
|
54
|
-
Log.d(TAG, "[DEBUG] BannerAdView constructor completed - LayoutParams set (width=MATCH_PARENT, height=" + _expectedHeight + ")");
|
|
55
46
|
}
|
|
56
47
|
|
|
57
48
|
public void setWidth(int width) {
|
|
58
|
-
|
|
59
|
-
_expectedWidth = width;
|
|
49
|
+
mExpectedWidth = width;
|
|
60
50
|
showAd();
|
|
61
51
|
}
|
|
62
52
|
|
|
63
53
|
public void setHeight(int height) {
|
|
64
|
-
|
|
65
|
-
_expectedHeight = height;
|
|
54
|
+
mExpectedHeight = height;
|
|
66
55
|
|
|
67
56
|
ViewGroup.LayoutParams params = getLayoutParams();
|
|
68
57
|
if (params != null) {
|
|
69
58
|
params.height = height;
|
|
70
59
|
setLayoutParams(params);
|
|
71
|
-
Log.d(TAG, "[DEBUG] setHeight - LayoutParams updated to height=" + height);
|
|
72
60
|
}
|
|
73
61
|
|
|
74
62
|
showAd();
|
|
75
63
|
}
|
|
76
64
|
|
|
77
65
|
public void setCodeId(String codeId) {
|
|
78
|
-
|
|
79
|
-
_codeid = codeId;
|
|
66
|
+
mCodeId = codeId;
|
|
80
67
|
showAd();
|
|
81
68
|
}
|
|
82
69
|
|
|
@@ -85,10 +72,8 @@ public class BannerAdView extends RelativeLayout {
|
|
|
85
72
|
* @param visible true: 可见,false: 不可见
|
|
86
73
|
*/
|
|
87
74
|
public void setVisibility(boolean visible) {
|
|
88
|
-
Log.d(TAG, "[DEBUG] setVisibility called - visible=" + visible + ", current codeid=" + _codeid + ", SDK initialized=" + (DyADCore.TTAdSdk != null));
|
|
89
75
|
if (visible) {
|
|
90
76
|
super.setVisibility(View.VISIBLE);
|
|
91
|
-
// 可见时尝试加载广告
|
|
92
77
|
showAd();
|
|
93
78
|
} else {
|
|
94
79
|
super.setVisibility(View.INVISIBLE);
|
|
@@ -96,129 +81,107 @@ public class BannerAdView extends RelativeLayout {
|
|
|
96
81
|
}
|
|
97
82
|
|
|
98
83
|
public void showAd() {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
// 显示广告
|
|
102
|
-
if (_expectedWidth <= 0 || _expectedHeight <= 0 || _codeid.isEmpty()) {
|
|
103
|
-
Log.w(TAG, "[DEBUG] showAd aborted - width=" + _expectedWidth + " (must >0), height=" + _expectedHeight + " (must >0), codeid=" + _codeid + " (must not be empty)");
|
|
104
|
-
// 广告宽高未设置或 code id 未设置,停止显示广告
|
|
84
|
+
// 参数校验
|
|
85
|
+
if (mExpectedWidth <= 0 || mExpectedHeight <= 0 || mCodeId == null || mCodeId.isEmpty()) {
|
|
105
86
|
return;
|
|
106
87
|
}
|
|
107
88
|
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
loadBannerAd();
|
|
113
|
-
}
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// 显示Banner广告
|
|
118
|
-
public void loadBannerAd() {
|
|
119
|
-
Log.d(TAG, "[DEBUG] loadBannerAd called - SDK initialized=" + (DyADCore.TTAdSdk != null) + ", codeid=" + _codeid);
|
|
89
|
+
// 防止重复加载
|
|
90
|
+
if (mIsAdLoading) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
120
93
|
|
|
94
|
+
// 检查 SDK 初始化
|
|
121
95
|
if (DyADCore.TTAdSdk == null) {
|
|
122
|
-
Log.e(TAG, "[DEBUG] loadBannerAd aborted - TTAdSdk not initialized yet");
|
|
123
96
|
return;
|
|
124
97
|
}
|
|
125
98
|
|
|
126
|
-
//
|
|
99
|
+
// 在UI线程加载广告
|
|
100
|
+
mIsAdLoading = true;
|
|
101
|
+
runOnUiThread(this::loadBannerAd);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// 显示Banner广告
|
|
105
|
+
private void loadBannerAd() {
|
|
127
106
|
if (mBannerAd != null) {
|
|
128
|
-
Log.d(TAG, "[DEBUG] loadBannerAd - destroying previous ad");
|
|
129
107
|
mBannerAd.destroy();
|
|
130
108
|
}
|
|
131
109
|
|
|
132
110
|
// 创建广告请求参数AdSlot
|
|
133
|
-
|
|
111
|
+
mAdSlot =
|
|
134
112
|
new AdSlot.Builder()
|
|
135
|
-
.setCodeId(
|
|
113
|
+
.setCodeId(mCodeId)
|
|
136
114
|
.setSupportDeepLink(true)
|
|
137
|
-
.setAdCount(1)
|
|
138
|
-
.setExpressViewAcceptedSize(
|
|
115
|
+
.setAdCount(1)
|
|
116
|
+
.setExpressViewAcceptedSize(mExpectedWidth, mExpectedHeight)
|
|
139
117
|
.build();
|
|
140
118
|
|
|
141
|
-
Log.d(TAG, "[DEBUG] loadBannerAd - requesting ad with AdSlot: codeid=" + _codeid + ", width=" + _expectedWidth + ", height=" + _expectedHeight);
|
|
142
|
-
|
|
143
|
-
// 请求广告
|
|
144
|
-
final BannerAdView _this = this;
|
|
145
119
|
DyADCore.TTAdSdk.loadBannerExpressAd(
|
|
146
|
-
|
|
120
|
+
mAdSlot,
|
|
147
121
|
new TTAdNative.NativeExpressAdListener() {
|
|
148
122
|
|
|
149
123
|
@Override
|
|
150
124
|
public void onError(int code, String message) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
Log.e(TAG, message);
|
|
155
|
-
onAdError(message);
|
|
125
|
+
mIsAdLoading = false;
|
|
126
|
+
String errorMsg = "Banner ad error: " + code + ", " + message;
|
|
127
|
+
onAdError(errorMsg);
|
|
156
128
|
}
|
|
157
129
|
|
|
158
130
|
@Override
|
|
159
131
|
public void onNativeExpressAdLoad(java.util.List<TTNativeExpressAd> ads) {
|
|
160
|
-
Log.d(TAG, "[DEBUG] onNativeExpressAdLoad - ads received=" + (ads != null ? ads.size() : "null"));
|
|
161
132
|
if (ads == null || ads.isEmpty()) {
|
|
162
|
-
|
|
133
|
+
mIsAdLoading = false;
|
|
163
134
|
onAdError("Banner ad loaded but no content");
|
|
164
135
|
return;
|
|
165
136
|
}
|
|
166
137
|
|
|
138
|
+
mIsAdLoading = false;
|
|
167
139
|
mBannerAd = ads.get(0);
|
|
168
|
-
|
|
169
|
-
_showBannerAd(mBannerAd);
|
|
140
|
+
showBannerAd(mBannerAd);
|
|
170
141
|
}
|
|
171
142
|
}
|
|
172
143
|
);
|
|
173
144
|
}
|
|
174
145
|
|
|
175
146
|
// 显示广告
|
|
176
|
-
private void
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
147
|
+
private void showBannerAd(final TTNativeExpressAd ad) {
|
|
148
|
+
if (mActivity == null) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
mActivity.runOnUiThread(() -> {
|
|
152
|
+
bindAdListener(ad);
|
|
153
|
+
ad.render();
|
|
154
|
+
});
|
|
183
155
|
}
|
|
184
156
|
|
|
185
157
|
// 绑定Banner express ================================
|
|
186
158
|
private final void bindAdListener(TTNativeExpressAd ad) {
|
|
187
159
|
final RelativeLayout mExpressContainer = findViewById(R.id.feed_container);
|
|
160
|
+
if (mExpressContainer == null) {
|
|
161
|
+
onAdError("feed_container not found");
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
188
165
|
ad.setExpressInteractionListener(
|
|
189
166
|
new TTNativeExpressAd.ExpressAdInteractionListener() {
|
|
190
167
|
|
|
191
168
|
@Override
|
|
192
169
|
public void onAdClicked(View view, int type) {
|
|
193
|
-
Log.d(TAG, "Banner ad clicked");
|
|
194
170
|
onAdClick();
|
|
195
171
|
}
|
|
196
172
|
|
|
197
173
|
@Override
|
|
198
174
|
public void onAdShow(View view, int type) {
|
|
199
|
-
Log.d(TAG, "Banner onAdShow");
|
|
200
175
|
BannerAdView.this.onAdShow();
|
|
201
176
|
}
|
|
202
177
|
|
|
203
178
|
@Override
|
|
204
179
|
public void onRenderFail(View view, String msg, int code) {
|
|
205
|
-
Log.e(TAG, "Banner render fail: " + code + ", " + msg);
|
|
206
180
|
onAdError("渲染失败: " + msg);
|
|
207
181
|
}
|
|
208
182
|
|
|
209
183
|
@Override
|
|
210
184
|
public void onRenderSuccess(View view, float width, float height) {
|
|
211
|
-
Log.d(TAG, "[DEBUG] onRenderSuccess - adView width=" + width + ", adView height=" + height);
|
|
212
|
-
|
|
213
|
-
RelativeLayout mExpressContainer = findViewById(R.id.feed_container);
|
|
214
|
-
|
|
215
|
-
if (mExpressContainer == null) {
|
|
216
|
-
Log.e(TAG, "[DEBUG] onRenderSuccess - feed_container is null!");
|
|
217
|
-
onAdError("feed_container not found");
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
Log.d(TAG, "[DEBUG] onRenderSuccess - feed_container found, removing old views");
|
|
222
185
|
mExpressContainer.removeAllViews();
|
|
223
186
|
|
|
224
187
|
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
|
|
@@ -227,25 +190,20 @@ public class BannerAdView extends RelativeLayout {
|
|
|
227
190
|
);
|
|
228
191
|
mExpressContainer.addView(view, params);
|
|
229
192
|
|
|
230
|
-
|
|
231
|
-
|
|
193
|
+
// 更新容器高度
|
|
232
194
|
ViewGroup.LayoutParams containerParams = mExpressContainer.getLayoutParams();
|
|
233
195
|
if (containerParams != null) {
|
|
234
196
|
containerParams.height = (int) height;
|
|
235
197
|
mExpressContainer.setLayoutParams(containerParams);
|
|
236
|
-
Log.d(TAG, "[DEBUG] onRenderSuccess - feed_container LayoutParams updated to height=" + (int) height);
|
|
237
198
|
}
|
|
238
199
|
|
|
200
|
+
// 更新父视图高度
|
|
239
201
|
ViewGroup.LayoutParams viewParams = BannerAdView.this.getLayoutParams();
|
|
240
202
|
if (viewParams != null) {
|
|
241
203
|
viewParams.height = (int) height;
|
|
242
204
|
BannerAdView.this.setLayoutParams(viewParams);
|
|
243
|
-
Log.d(TAG, "[DEBUG] onRenderSuccess - BannerAdView LayoutParams updated to height=" + (int) height);
|
|
244
205
|
}
|
|
245
206
|
|
|
246
|
-
Log.d(TAG, "[DEBUG] onRenderSuccess - BannerAdView size: width=" + BannerAdView.this.getWidth() + ", height=" + BannerAdView.this.getHeight());
|
|
247
|
-
Log.d(TAG, "[DEBUG] onRenderSuccess - feed_container size: width=" + mExpressContainer.getWidth() + ", height=" + mExpressContainer.getHeight());
|
|
248
|
-
|
|
249
207
|
view.setVisibility(View.VISIBLE);
|
|
250
208
|
mExpressContainer.setVisibility(View.VISIBLE);
|
|
251
209
|
BannerAdView.this.setVisibility(View.VISIBLE);
|
|
@@ -253,8 +211,6 @@ public class BannerAdView extends RelativeLayout {
|
|
|
253
211
|
mExpressContainer.requestLayout();
|
|
254
212
|
BannerAdView.this.requestLayout();
|
|
255
213
|
|
|
256
|
-
Log.d(TAG, "[DEBUG] onRenderSuccess - layout requested, sending onAdRenderSuccess event");
|
|
257
|
-
|
|
258
214
|
onAdRenderSuccess((int) width, (int) height);
|
|
259
215
|
}
|
|
260
216
|
}
|
|
@@ -265,13 +221,10 @@ public class BannerAdView extends RelativeLayout {
|
|
|
265
221
|
|
|
266
222
|
/**
|
|
267
223
|
* 设置广告的不喜欢
|
|
268
|
-
*
|
|
269
|
-
* @param ad
|
|
270
224
|
*/
|
|
271
225
|
private void bindDislike(TTNativeExpressAd ad) {
|
|
272
|
-
// 使用默认个性化模板中默认dislike弹出样式
|
|
273
226
|
ad.setDislikeCallback(
|
|
274
|
-
|
|
227
|
+
mActivity,
|
|
275
228
|
new TTAdDislike.DislikeInteractionCallback() {
|
|
276
229
|
|
|
277
230
|
@Override
|
|
@@ -279,8 +232,6 @@ public class BannerAdView extends RelativeLayout {
|
|
|
279
232
|
|
|
280
233
|
@Override
|
|
281
234
|
public void onSelected(int position, String value, boolean enforce) {
|
|
282
|
-
Log.d(TAG, "Banner dislike selected: " + value);
|
|
283
|
-
// 用户选择不喜欢原因后,移除广告展示
|
|
284
235
|
RelativeLayout mExpressContainer = findViewById(R.id.feed_container);
|
|
285
236
|
if (mExpressContainer != null) {
|
|
286
237
|
mExpressContainer.removeAllViews();
|
|
@@ -289,64 +240,55 @@ public class BannerAdView extends RelativeLayout {
|
|
|
289
240
|
}
|
|
290
241
|
|
|
291
242
|
@Override
|
|
292
|
-
public void onCancel() {
|
|
293
|
-
Log.d(TAG, "Banner dislike cancel");
|
|
294
|
-
}
|
|
243
|
+
public void onCancel() {}
|
|
295
244
|
}
|
|
296
245
|
);
|
|
297
246
|
}
|
|
298
247
|
|
|
299
248
|
// 外部事件..
|
|
249
|
+
private void sendEvent(String eventName, WritableMap event) {
|
|
250
|
+
mReactContext
|
|
251
|
+
.getJSModule(RCTEventEmitter.class)
|
|
252
|
+
.receiveEvent(getId(), eventName, event);
|
|
253
|
+
}
|
|
254
|
+
|
|
300
255
|
public void onAdError(String message) {
|
|
301
256
|
WritableMap event = Arguments.createMap();
|
|
302
257
|
event.putString("message", message);
|
|
303
|
-
|
|
304
|
-
.getJSModule(RCTEventEmitter.class)
|
|
305
|
-
.receiveEvent(getId(), "onAdError", event);
|
|
258
|
+
sendEvent("onAdError", event);
|
|
306
259
|
}
|
|
307
260
|
|
|
308
261
|
public void onAdClick() {
|
|
309
262
|
WritableMap event = Arguments.createMap();
|
|
310
|
-
|
|
311
|
-
.getJSModule(RCTEventEmitter.class)
|
|
312
|
-
.receiveEvent(getId(), "onAdClick", event);
|
|
263
|
+
sendEvent("onAdClick", event);
|
|
313
264
|
}
|
|
314
265
|
|
|
315
266
|
public void onAdShow() {
|
|
316
267
|
WritableMap event = Arguments.createMap();
|
|
317
|
-
|
|
318
|
-
.getJSModule(RCTEventEmitter.class)
|
|
319
|
-
.receiveEvent(getId(), "onAdShow", event);
|
|
268
|
+
sendEvent("onAdShow", event);
|
|
320
269
|
}
|
|
321
270
|
|
|
322
271
|
public void onAdDismiss() {
|
|
323
272
|
WritableMap event = Arguments.createMap();
|
|
324
|
-
|
|
325
|
-
.getJSModule(RCTEventEmitter.class)
|
|
326
|
-
.receiveEvent(getId(), "onAdDismiss", event);
|
|
273
|
+
sendEvent("onAdDismiss", event);
|
|
327
274
|
}
|
|
328
275
|
|
|
329
276
|
public void onAdRenderSuccess(int width, int height) {
|
|
330
277
|
WritableMap event = Arguments.createMap();
|
|
331
278
|
event.putInt("width", width);
|
|
332
279
|
event.putInt("height", height);
|
|
333
|
-
|
|
334
|
-
.getJSModule(RCTEventEmitter.class)
|
|
335
|
-
.receiveEvent(getId(), "onAdRenderSuccess", event);
|
|
280
|
+
sendEvent("onAdRenderSuccess", event);
|
|
336
281
|
}
|
|
337
282
|
|
|
338
283
|
public void onAdDislike(String reason) {
|
|
339
284
|
WritableMap event = Arguments.createMap();
|
|
340
285
|
event.putString("reason", reason);
|
|
341
|
-
|
|
342
|
-
.getJSModule(RCTEventEmitter.class)
|
|
343
|
-
.receiveEvent(getId(), "onAdDislike", event);
|
|
286
|
+
sendEvent("onAdDislike", event);
|
|
344
287
|
}
|
|
345
288
|
|
|
346
289
|
@Override
|
|
347
290
|
protected void onDetachedFromWindow() {
|
|
348
291
|
super.onDetachedFromWindow();
|
|
349
|
-
// View被移除时销毁广告
|
|
350
292
|
if (mBannerAd != null) {
|
|
351
293
|
mBannerAd.destroy();
|
|
352
294
|
mBannerAd = null;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
3
3
|
android:id="@+id/feed_container"
|
|
4
4
|
android:layout_width="match_parent"
|
|
5
|
-
android:layout_height="
|
|
5
|
+
android:layout_height="wrap_content"
|
|
6
6
|
android:background="#FFFFFF"
|
|
7
7
|
android:orientation="vertical"
|
|
8
8
|
android:layout_gravity="center"
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
// To avoid "Tried to register two views with the same name" error,
|
|
24
24
|
// we do not register this ViewManager on iOS
|
|
25
25
|
// Uncomment the line below if iOS support is added in the future
|
|
26
|
-
// RCT_EXPORT_MODULE(
|
|
26
|
+
// RCT_EXPORT_MODULE(BannerAdViewManager)
|
|
27
27
|
|
|
28
28
|
- (UIView *)view {
|
|
29
29
|
// BannerAd is managed by BannerAd singleton, not a direct view
|
|
@@ -9,7 +9,7 @@ var _reactNative = require("react-native");
|
|
|
9
9
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
10
10
|
// BannerAd currently only supports Android platform
|
|
11
11
|
const ComponentName = _reactNative.Platform.select({
|
|
12
|
-
android: '
|
|
12
|
+
android: 'BannerAdViewManager',
|
|
13
13
|
ios: undefined
|
|
14
14
|
});
|
|
15
15
|
const LINKING_ERROR = `The package 'react-native-brayant-ad' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
|
|
@@ -34,17 +34,9 @@ const BannerAdView = props => {
|
|
|
34
34
|
visible = true
|
|
35
35
|
} = props;
|
|
36
36
|
|
|
37
|
-
//
|
|
38
|
-
if (_reactNative.Platform.OS !== 'android') {
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
if (!visible) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
37
|
+
// All hooks must be called at the top level, unconditionally
|
|
44
38
|
const [dismissed, setDismissed] = (0, _react.useState)(false);
|
|
45
39
|
const [height, setHeight] = (0, _react.useState)(adHeight);
|
|
46
|
-
|
|
47
|
-
// Use ref to track if height has been set to prevent unnecessary re-renders
|
|
48
40
|
const heightInitialized = (0, _react.useRef)(false);
|
|
49
41
|
|
|
50
42
|
// Reset state when visible changes from false to true to allow re-display
|
|
@@ -56,61 +48,44 @@ const BannerAdView = props => {
|
|
|
56
48
|
}
|
|
57
49
|
}, [visible, adHeight]);
|
|
58
50
|
|
|
59
|
-
// Early
|
|
60
|
-
if (dismissed)
|
|
51
|
+
// Early returns after all hooks
|
|
52
|
+
if (_reactNative.Platform.OS !== 'android' || !visible || dismissed) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
61
55
|
if (!BannerAdNativeComponent) {
|
|
62
56
|
throw new Error(LINKING_ERROR);
|
|
63
57
|
}
|
|
64
|
-
|
|
65
|
-
// Use useMemo to cache style object and prevent unnecessary re-renders
|
|
66
|
-
const containerStyle = (0, _react.useMemo)(() => ({
|
|
67
|
-
width: adWidth,
|
|
68
|
-
height,
|
|
69
|
-
...style
|
|
70
|
-
}), [adWidth, height, style]);
|
|
71
|
-
|
|
72
|
-
// Stable callbacks using useCallback to prevent re-renders
|
|
73
|
-
const handleError = (0, _react.useCallback)(e => {
|
|
74
|
-
onAdError === null || onAdError === void 0 || onAdError(e.nativeEvent);
|
|
75
|
-
}, [onAdError]);
|
|
76
|
-
const handleClick = (0, _react.useCallback)(e => {
|
|
77
|
-
onAdClick === null || onAdClick === void 0 || onAdClick(e.nativeEvent);
|
|
78
|
-
}, [onAdClick]);
|
|
79
|
-
const handleDismiss = (0, _react.useCallback)(e => {
|
|
80
|
-
setDismissed(true);
|
|
81
|
-
onAdDismiss === null || onAdDismiss === void 0 || onAdDismiss(e.nativeEvent);
|
|
82
|
-
}, [onAdDismiss]);
|
|
83
|
-
const handleShow = (0, _react.useCallback)(e => {
|
|
84
|
-
onAdShow === null || onAdShow === void 0 || onAdShow(e.nativeEvent);
|
|
85
|
-
}, [onAdShow]);
|
|
86
|
-
const handleRenderSuccess = (0, _react.useCallback)(e => {
|
|
87
|
-
const newHeight = e.nativeEvent.height;
|
|
88
|
-
if (newHeight && !heightInitialized.current) {
|
|
89
|
-
setHeight(newHeight + 10);
|
|
90
|
-
heightInitialized.current = true;
|
|
91
|
-
}
|
|
92
|
-
onAdRenderSuccess === null || onAdRenderSuccess === void 0 || onAdRenderSuccess(e.nativeEvent);
|
|
93
|
-
}, [onAdRenderSuccess]);
|
|
94
|
-
const handleDislike = (0, _react.useCallback)(e => {
|
|
95
|
-
setDismissed(true);
|
|
96
|
-
onAdDislike === null || onAdDislike === void 0 || onAdDislike(e.nativeEvent);
|
|
97
|
-
}, [onAdDislike]);
|
|
98
58
|
return /*#__PURE__*/_react.default.createElement(BannerAdNativeComponent, {
|
|
99
59
|
codeid: codeid,
|
|
100
60
|
adWidth: adWidth,
|
|
101
61
|
adHeight: height,
|
|
102
|
-
style:
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
62
|
+
style: {
|
|
63
|
+
width: adWidth,
|
|
64
|
+
height,
|
|
65
|
+
...style
|
|
66
|
+
},
|
|
67
|
+
onAdError: e => onAdError === null || onAdError === void 0 ? void 0 : onAdError(e.nativeEvent),
|
|
68
|
+
onAdClick: e => onAdClick === null || onAdClick === void 0 ? void 0 : onAdClick(e.nativeEvent),
|
|
69
|
+
onAdDismiss: e => {
|
|
70
|
+
setDismissed(true);
|
|
71
|
+
onAdDismiss === null || onAdDismiss === void 0 || onAdDismiss(e.nativeEvent);
|
|
72
|
+
},
|
|
73
|
+
onAdShow: e => onAdShow === null || onAdShow === void 0 ? void 0 : onAdShow(e.nativeEvent),
|
|
74
|
+
onAdRenderSuccess: e => {
|
|
75
|
+
const newHeight = e.nativeEvent.height;
|
|
76
|
+
if (newHeight && !heightInitialized.current) {
|
|
77
|
+
setHeight(newHeight + 10);
|
|
78
|
+
heightInitialized.current = true;
|
|
79
|
+
}
|
|
80
|
+
onAdRenderSuccess === null || onAdRenderSuccess === void 0 || onAdRenderSuccess(e.nativeEvent);
|
|
81
|
+
},
|
|
82
|
+
onAdDislike: e => {
|
|
83
|
+
setDismissed(true);
|
|
84
|
+
onAdDislike === null || onAdDislike === void 0 || onAdDislike(e.nativeEvent);
|
|
85
|
+
}
|
|
109
86
|
});
|
|
110
87
|
};
|
|
111
88
|
var _default = exports.default = /*#__PURE__*/_react.default.memo(BannerAdView, (prevProps, nextProps) => {
|
|
112
|
-
// Custom comparison function for React.memo
|
|
113
|
-
// Only re-render if visible changes or key props change
|
|
114
89
|
return prevProps.codeid === nextProps.codeid && prevProps.visible === nextProps.visible && prevProps.adWidth === nextProps.adWidth && prevProps.adHeight === nextProps.adHeight;
|
|
115
90
|
});
|
|
116
91
|
//# sourceMappingURL=BannerAd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ComponentName","Platform","select","android","ios","undefined","LINKING_ERROR","BannerAdNativeComponent","UIManager","getViewManagerConfig","requireNativeComponent","BannerAdView","props","codeid","style","adWidth","adHeight","onAdRenderSuccess","onAdError","onAdDismiss","onAdClick","onAdShow","onAdDislike","visible","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ComponentName","Platform","select","android","ios","undefined","LINKING_ERROR","BannerAdNativeComponent","UIManager","getViewManagerConfig","requireNativeComponent","BannerAdView","props","codeid","style","adWidth","adHeight","onAdRenderSuccess","onAdError","onAdDismiss","onAdClick","onAdShow","onAdDislike","visible","dismissed","setDismissed","useState","height","setHeight","heightInitialized","useRef","useEffect","current","OS","Error","createElement","width","nativeEvent","newHeight","_default","exports","React","memo","prevProps","nextProps"],"sourceRoot":"../../../../src","sources":["dy/component/BannerAd.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import React, { useState,
|
|
1
|
+
import React, { useState, useRef, useEffect } from 'react';
|
|
2
2
|
import { Platform, requireNativeComponent, UIManager } from 'react-native';
|
|
3
3
|
// BannerAd currently only supports Android platform
|
|
4
4
|
const ComponentName = Platform.select({
|
|
5
|
-
android: '
|
|
5
|
+
android: 'BannerAdViewManager',
|
|
6
6
|
ios: undefined
|
|
7
7
|
});
|
|
8
8
|
const LINKING_ERROR = `The package 'react-native-brayant-ad' doesn't seem to be linked. Make sure: \n\n` + Platform.select({
|
|
@@ -27,17 +27,9 @@ const BannerAdView = props => {
|
|
|
27
27
|
visible = true
|
|
28
28
|
} = props;
|
|
29
29
|
|
|
30
|
-
//
|
|
31
|
-
if (Platform.OS !== 'android') {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
if (!visible) {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
30
|
+
// All hooks must be called at the top level, unconditionally
|
|
37
31
|
const [dismissed, setDismissed] = useState(false);
|
|
38
32
|
const [height, setHeight] = useState(adHeight);
|
|
39
|
-
|
|
40
|
-
// Use ref to track if height has been set to prevent unnecessary re-renders
|
|
41
33
|
const heightInitialized = useRef(false);
|
|
42
34
|
|
|
43
35
|
// Reset state when visible changes from false to true to allow re-display
|
|
@@ -49,61 +41,44 @@ const BannerAdView = props => {
|
|
|
49
41
|
}
|
|
50
42
|
}, [visible, adHeight]);
|
|
51
43
|
|
|
52
|
-
// Early
|
|
53
|
-
if (dismissed)
|
|
44
|
+
// Early returns after all hooks
|
|
45
|
+
if (Platform.OS !== 'android' || !visible || dismissed) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
54
48
|
if (!BannerAdNativeComponent) {
|
|
55
49
|
throw new Error(LINKING_ERROR);
|
|
56
50
|
}
|
|
57
|
-
|
|
58
|
-
// Use useMemo to cache style object and prevent unnecessary re-renders
|
|
59
|
-
const containerStyle = useMemo(() => ({
|
|
60
|
-
width: adWidth,
|
|
61
|
-
height,
|
|
62
|
-
...style
|
|
63
|
-
}), [adWidth, height, style]);
|
|
64
|
-
|
|
65
|
-
// Stable callbacks using useCallback to prevent re-renders
|
|
66
|
-
const handleError = useCallback(e => {
|
|
67
|
-
onAdError === null || onAdError === void 0 || onAdError(e.nativeEvent);
|
|
68
|
-
}, [onAdError]);
|
|
69
|
-
const handleClick = useCallback(e => {
|
|
70
|
-
onAdClick === null || onAdClick === void 0 || onAdClick(e.nativeEvent);
|
|
71
|
-
}, [onAdClick]);
|
|
72
|
-
const handleDismiss = useCallback(e => {
|
|
73
|
-
setDismissed(true);
|
|
74
|
-
onAdDismiss === null || onAdDismiss === void 0 || onAdDismiss(e.nativeEvent);
|
|
75
|
-
}, [onAdDismiss]);
|
|
76
|
-
const handleShow = useCallback(e => {
|
|
77
|
-
onAdShow === null || onAdShow === void 0 || onAdShow(e.nativeEvent);
|
|
78
|
-
}, [onAdShow]);
|
|
79
|
-
const handleRenderSuccess = useCallback(e => {
|
|
80
|
-
const newHeight = e.nativeEvent.height;
|
|
81
|
-
if (newHeight && !heightInitialized.current) {
|
|
82
|
-
setHeight(newHeight + 10);
|
|
83
|
-
heightInitialized.current = true;
|
|
84
|
-
}
|
|
85
|
-
onAdRenderSuccess === null || onAdRenderSuccess === void 0 || onAdRenderSuccess(e.nativeEvent);
|
|
86
|
-
}, [onAdRenderSuccess]);
|
|
87
|
-
const handleDislike = useCallback(e => {
|
|
88
|
-
setDismissed(true);
|
|
89
|
-
onAdDislike === null || onAdDislike === void 0 || onAdDislike(e.nativeEvent);
|
|
90
|
-
}, [onAdDislike]);
|
|
91
51
|
return /*#__PURE__*/React.createElement(BannerAdNativeComponent, {
|
|
92
52
|
codeid: codeid,
|
|
93
53
|
adWidth: adWidth,
|
|
94
54
|
adHeight: height,
|
|
95
|
-
style:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
55
|
+
style: {
|
|
56
|
+
width: adWidth,
|
|
57
|
+
height,
|
|
58
|
+
...style
|
|
59
|
+
},
|
|
60
|
+
onAdError: e => onAdError === null || onAdError === void 0 ? void 0 : onAdError(e.nativeEvent),
|
|
61
|
+
onAdClick: e => onAdClick === null || onAdClick === void 0 ? void 0 : onAdClick(e.nativeEvent),
|
|
62
|
+
onAdDismiss: e => {
|
|
63
|
+
setDismissed(true);
|
|
64
|
+
onAdDismiss === null || onAdDismiss === void 0 || onAdDismiss(e.nativeEvent);
|
|
65
|
+
},
|
|
66
|
+
onAdShow: e => onAdShow === null || onAdShow === void 0 ? void 0 : onAdShow(e.nativeEvent),
|
|
67
|
+
onAdRenderSuccess: e => {
|
|
68
|
+
const newHeight = e.nativeEvent.height;
|
|
69
|
+
if (newHeight && !heightInitialized.current) {
|
|
70
|
+
setHeight(newHeight + 10);
|
|
71
|
+
heightInitialized.current = true;
|
|
72
|
+
}
|
|
73
|
+
onAdRenderSuccess === null || onAdRenderSuccess === void 0 || onAdRenderSuccess(e.nativeEvent);
|
|
74
|
+
},
|
|
75
|
+
onAdDislike: e => {
|
|
76
|
+
setDismissed(true);
|
|
77
|
+
onAdDislike === null || onAdDislike === void 0 || onAdDislike(e.nativeEvent);
|
|
78
|
+
}
|
|
102
79
|
});
|
|
103
80
|
};
|
|
104
81
|
export default /*#__PURE__*/React.memo(BannerAdView, (prevProps, nextProps) => {
|
|
105
|
-
// Custom comparison function for React.memo
|
|
106
|
-
// Only re-render if visible changes or key props change
|
|
107
82
|
return prevProps.codeid === nextProps.codeid && prevProps.visible === nextProps.visible && prevProps.adWidth === nextProps.adWidth && prevProps.adHeight === nextProps.adHeight;
|
|
108
83
|
});
|
|
109
84
|
//# sourceMappingURL=BannerAd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useState","
|
|
1
|
+
{"version":3,"names":["React","useState","useRef","useEffect","Platform","requireNativeComponent","UIManager","ComponentName","select","android","ios","undefined","LINKING_ERROR","default","BannerAdNativeComponent","getViewManagerConfig","BannerAdView","props","codeid","style","adWidth","adHeight","onAdRenderSuccess","onAdError","onAdDismiss","onAdClick","onAdShow","onAdDislike","visible","dismissed","setDismissed","height","setHeight","heightInitialized","current","OS","Error","createElement","width","e","nativeEvent","newHeight","memo","prevProps","nextProps"],"sourceRoot":"../../../../src","sources":["dy/component/BannerAd.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { ViewStyle } from 'react-native';
|
|
3
|
+
export interface BannerAdEvent {
|
|
4
|
+
message?: string;
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
reason?: string;
|
|
8
|
+
}
|
|
3
9
|
export interface BannerAdProps {
|
|
4
10
|
codeid: string;
|
|
5
11
|
style?: ViewStyle;
|
|
6
12
|
adWidth?: number;
|
|
7
13
|
adHeight?: number;
|
|
8
14
|
visible?: boolean;
|
|
9
|
-
onAdRenderSuccess?:
|
|
10
|
-
onAdError?:
|
|
11
|
-
onAdDismiss?:
|
|
12
|
-
onAdClick?:
|
|
13
|
-
onAdShow?:
|
|
14
|
-
onAdDislike?:
|
|
15
|
+
onAdRenderSuccess?: (event: BannerAdEvent) => void;
|
|
16
|
+
onAdError?: (event: BannerAdEvent) => void;
|
|
17
|
+
onAdDismiss?: (event: BannerAdEvent) => void;
|
|
18
|
+
onAdClick?: (event: BannerAdEvent) => void;
|
|
19
|
+
onAdShow?: (event: BannerAdEvent) => void;
|
|
20
|
+
onAdDislike?: (event: BannerAdEvent) => void;
|
|
15
21
|
}
|
|
16
22
|
declare const _default: React.MemoExoticComponent<(props: BannerAdProps) => React.JSX.Element | null>;
|
|
17
23
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BannerAd.d.ts","sourceRoot":"","sources":["../../../../../src/dy/component/BannerAd.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"BannerAd.d.ts","sourceRoot":"","sources":["../../../../../src/dy/component/BannerAd.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQ9C,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACnD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC3C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC9C;0DAe4B,aAAa;AAmE1C,wBAOG"}
|
package/package.json
CHANGED
|
@@ -1,25 +1,32 @@
|
|
|
1
|
-
import React, { useState,
|
|
1
|
+
import React, { useState, useRef, useEffect } from 'react';
|
|
2
2
|
import { Platform, requireNativeComponent, UIManager } from 'react-native';
|
|
3
3
|
import type { ViewStyle } from 'react-native';
|
|
4
4
|
|
|
5
5
|
// BannerAd currently only supports Android platform
|
|
6
6
|
const ComponentName = Platform.select({
|
|
7
|
-
android: '
|
|
7
|
+
android: 'BannerAdViewManager',
|
|
8
8
|
ios: undefined,
|
|
9
9
|
}) as string | undefined;
|
|
10
10
|
|
|
11
|
+
export interface BannerAdEvent {
|
|
12
|
+
message?: string;
|
|
13
|
+
width?: number;
|
|
14
|
+
height?: number;
|
|
15
|
+
reason?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
11
18
|
export interface BannerAdProps {
|
|
12
19
|
codeid: string;
|
|
13
20
|
style?: ViewStyle;
|
|
14
21
|
adWidth?: number;
|
|
15
22
|
adHeight?: number;
|
|
16
23
|
visible?: boolean;
|
|
17
|
-
onAdRenderSuccess?:
|
|
18
|
-
onAdError?:
|
|
19
|
-
onAdDismiss?:
|
|
20
|
-
onAdClick?:
|
|
21
|
-
onAdShow?:
|
|
22
|
-
onAdDislike?:
|
|
24
|
+
onAdRenderSuccess?: (event: BannerAdEvent) => void;
|
|
25
|
+
onAdError?: (event: BannerAdEvent) => void;
|
|
26
|
+
onAdDismiss?: (event: BannerAdEvent) => void;
|
|
27
|
+
onAdClick?: (event: BannerAdEvent) => void;
|
|
28
|
+
onAdShow?: (event: BannerAdEvent) => void;
|
|
29
|
+
onAdDislike?: (event: BannerAdEvent) => void;
|
|
23
30
|
}
|
|
24
31
|
|
|
25
32
|
const LINKING_ERROR =
|
|
@@ -30,9 +37,10 @@ const LINKING_ERROR =
|
|
|
30
37
|
'\nNote: BannerAd is currently only supported on Android platform.';
|
|
31
38
|
|
|
32
39
|
// Define native component at module level to avoid duplicate registration
|
|
33
|
-
const BannerAdNativeComponent =
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
const BannerAdNativeComponent =
|
|
41
|
+
ComponentName && UIManager.getViewManagerConfig(ComponentName) != null
|
|
42
|
+
? requireNativeComponent<BannerAdProps>(ComponentName)
|
|
43
|
+
: undefined;
|
|
36
44
|
|
|
37
45
|
const BannerAdView = (props: BannerAdProps) => {
|
|
38
46
|
const {
|
|
@@ -49,19 +57,9 @@ const BannerAdView = (props: BannerAdProps) => {
|
|
|
49
57
|
visible = true,
|
|
50
58
|
} = props;
|
|
51
59
|
|
|
52
|
-
//
|
|
53
|
-
if (Platform.OS !== 'android') {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (!visible) {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
|
|
60
|
+
// All hooks must be called at the top level, unconditionally
|
|
61
61
|
const [dismissed, setDismissed] = useState(false);
|
|
62
62
|
const [height, setHeight] = useState(adHeight);
|
|
63
|
-
|
|
64
|
-
// Use ref to track if height has been set to prevent unnecessary re-renders
|
|
65
63
|
const heightInitialized = useRef(false);
|
|
66
64
|
|
|
67
65
|
// Reset state when visible changes from false to true to allow re-display
|
|
@@ -73,71 +71,45 @@ const BannerAdView = (props: BannerAdProps) => {
|
|
|
73
71
|
}
|
|
74
72
|
}, [visible, adHeight]);
|
|
75
73
|
|
|
76
|
-
// Early
|
|
77
|
-
if (dismissed)
|
|
74
|
+
// Early returns after all hooks
|
|
75
|
+
if (Platform.OS !== 'android' || !visible || dismissed) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
78
|
|
|
79
79
|
if (!BannerAdNativeComponent) {
|
|
80
80
|
throw new Error(LINKING_ERROR);
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
// Use useMemo to cache style object and prevent unnecessary re-renders
|
|
84
|
-
const containerStyle = useMemo(() => ({
|
|
85
|
-
width: adWidth,
|
|
86
|
-
height,
|
|
87
|
-
...style,
|
|
88
|
-
}), [adWidth, height, style]);
|
|
89
|
-
|
|
90
|
-
// Stable callbacks using useCallback to prevent re-renders
|
|
91
|
-
const handleError = useCallback((e: any) => {
|
|
92
|
-
onAdError?.(e.nativeEvent);
|
|
93
|
-
}, [onAdError]);
|
|
94
|
-
|
|
95
|
-
const handleClick = useCallback((e: any) => {
|
|
96
|
-
onAdClick?.(e.nativeEvent);
|
|
97
|
-
}, [onAdClick]);
|
|
98
|
-
|
|
99
|
-
const handleDismiss = useCallback((e: any) => {
|
|
100
|
-
setDismissed(true);
|
|
101
|
-
onAdDismiss?.(e.nativeEvent);
|
|
102
|
-
}, [onAdDismiss]);
|
|
103
|
-
|
|
104
|
-
const handleShow = useCallback((e: any) => {
|
|
105
|
-
onAdShow?.(e.nativeEvent);
|
|
106
|
-
}, [onAdShow]);
|
|
107
|
-
|
|
108
|
-
const handleRenderSuccess = useCallback((e: any) => {
|
|
109
|
-
const newHeight = e.nativeEvent.height;
|
|
110
|
-
if (newHeight && !heightInitialized.current) {
|
|
111
|
-
setHeight(newHeight + 10);
|
|
112
|
-
heightInitialized.current = true;
|
|
113
|
-
}
|
|
114
|
-
onAdRenderSuccess?.(e.nativeEvent);
|
|
115
|
-
}, [onAdRenderSuccess]);
|
|
116
|
-
|
|
117
|
-
const handleDislike = useCallback((e: any) => {
|
|
118
|
-
setDismissed(true);
|
|
119
|
-
onAdDislike?.(e.nativeEvent);
|
|
120
|
-
}, [onAdDislike]);
|
|
121
|
-
|
|
122
83
|
return (
|
|
123
84
|
<BannerAdNativeComponent
|
|
124
85
|
codeid={codeid}
|
|
125
86
|
adWidth={adWidth}
|
|
126
87
|
adHeight={height}
|
|
127
|
-
style={
|
|
128
|
-
onAdError={
|
|
129
|
-
onAdClick={
|
|
130
|
-
onAdDismiss={
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
88
|
+
style={{ width: adWidth, height, ...style }}
|
|
89
|
+
onAdError={(e: any) => onAdError?.(e.nativeEvent)}
|
|
90
|
+
onAdClick={(e: any) => onAdClick?.(e.nativeEvent)}
|
|
91
|
+
onAdDismiss={(e: any) => {
|
|
92
|
+
setDismissed(true);
|
|
93
|
+
onAdDismiss?.(e.nativeEvent);
|
|
94
|
+
}}
|
|
95
|
+
onAdShow={(e: any) => onAdShow?.(e.nativeEvent)}
|
|
96
|
+
onAdRenderSuccess={(e: any) => {
|
|
97
|
+
const newHeight = e.nativeEvent.height;
|
|
98
|
+
if (newHeight && !heightInitialized.current) {
|
|
99
|
+
setHeight(newHeight + 10);
|
|
100
|
+
heightInitialized.current = true;
|
|
101
|
+
}
|
|
102
|
+
onAdRenderSuccess?.(e.nativeEvent);
|
|
103
|
+
}}
|
|
104
|
+
onAdDislike={(e: any) => {
|
|
105
|
+
setDismissed(true);
|
|
106
|
+
onAdDislike?.(e.nativeEvent);
|
|
107
|
+
}}
|
|
134
108
|
/>
|
|
135
109
|
);
|
|
136
110
|
};
|
|
137
111
|
|
|
138
112
|
export default React.memo(BannerAdView, (prevProps, nextProps) => {
|
|
139
|
-
// Custom comparison function for React.memo
|
|
140
|
-
// Only re-render if visible changes or key props change
|
|
141
113
|
return (
|
|
142
114
|
prevProps.codeid === nextProps.codeid &&
|
|
143
115
|
prevProps.visible === nextProps.visible &&
|
|
@@ -145,4 +117,3 @@ export default React.memo(BannerAdView, (prevProps, nextProps) => {
|
|
|
145
117
|
prevProps.adHeight === nextProps.adHeight
|
|
146
118
|
);
|
|
147
119
|
});
|
|
148
|
-
|