@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.
@@ -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 = "BrayantBannerAdViewManager";
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
- // Banner广告
29
- private static final String TAG = "BannerAd";
30
-
31
- private Activity mContext;
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 _expectedWidth = 320; // 默认宽度 dp
38
- private int _expectedHeight = 50; // 默认高度 dp
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
- mContext = context.getCurrentActivity();
43
- reactContext = context;
44
- Log.d(TAG, "[DEBUG] BannerAdView constructor - inflating feed_view.xml");
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
- _expectedHeight
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
- Log.d(TAG, "[DEBUG] setWidth called - codeid=" + _codeid + ", width=" + width + ", current height=" + _expectedHeight);
59
- _expectedWidth = width;
49
+ mExpectedWidth = width;
60
50
  showAd();
61
51
  }
62
52
 
63
53
  public void setHeight(int height) {
64
- Log.d(TAG, "[DEBUG] setHeight called - codeid=" + _codeid + ", height=" + height + ", current width=" + _expectedWidth);
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
- Log.d(TAG, "[DEBUG] setCodeId called - codeid=" + codeId + ", _expectedWidth=" + _expectedWidth + ", _expectedHeight=" + _expectedHeight);
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
- Log.d(TAG, "[DEBUG] showAd called - width=" + _expectedWidth + ", height=" + _expectedHeight + ", codeid=" + _codeid + ", SDK initialized=" + (DyADCore.TTAdSdk != null));
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
- // 在UI线程加载广告
109
- runOnUiThread(
110
- () -> {
111
- Log.d(TAG, "[DEBUG] showAd - calling loadBannerAd on UI thread");
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
- adSlot =
111
+ mAdSlot =
134
112
  new AdSlot.Builder()
135
- .setCodeId(_codeid) // 广告位id
113
+ .setCodeId(mCodeId)
136
114
  .setSupportDeepLink(true)
137
- .setAdCount(1) // 请求数量设置为1
138
- .setExpressViewAcceptedSize(_expectedWidth, _expectedHeight) // 期望模板广告view的size,单位dp
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
- adSlot,
120
+ mAdSlot,
147
121
  new TTAdNative.NativeExpressAdListener() {
148
122
 
149
123
  @Override
150
124
  public void onError(int code, String message) {
151
- Log.e(TAG, "[DEBUG] onError - code=" + code + ", message=" + message);
152
- message =
153
- "Banner ad error: " + code + ", " + message;
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
- Log.e(TAG, "[DEBUG] onNativeExpressAdLoad - ads is null or empty");
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
- Log.d(TAG, "[DEBUG] onNativeExpressAdLoad - calling _showBannerAd");
169
- _showBannerAd(mBannerAd);
140
+ showBannerAd(mBannerAd);
170
141
  }
171
142
  }
172
143
  );
173
144
  }
174
145
 
175
146
  // 显示广告
176
- private void _showBannerAd(final TTNativeExpressAd ad) {
177
- mContext.runOnUiThread(
178
- () -> {
179
- bindAdListener(ad);
180
- ad.render();
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
- Log.d(TAG, "[DEBUG] onRenderSuccess - adView added to feed_container");
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
- mContext,
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
- reactContext
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
- reactContext
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
- reactContext
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
- reactContext
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
- reactContext
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
- reactContext
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="280dp"
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(BrayantBannerAdViewManager)
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: 'BrayantBannerAdViewManager',
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
- // BannerAd is only supported on Android - Check before hooks
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 return after dismissed state is set (after hooks)
60
- if (dismissed) return null;
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: containerStyle,
103
- onAdError: handleError,
104
- onAdClick: handleClick,
105
- onAdDismiss: handleDismiss,
106
- onAdShow: handleShow,
107
- onAdRenderSuccess: handleRenderSuccess,
108
- onAdDislike: handleDislike
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","OS","dismissed","setDismissed","useState","height","setHeight","heightInitialized","useRef","useEffect","current","Error","containerStyle","useMemo","width","handleError","useCallback","nativeEvent","handleClick","handleDismiss","handleShow","handleRenderSuccess","newHeight","handleDislike","createElement","_default","exports","React","memo","prevProps","nextProps"],"sourceRoot":"../../../../src","sources":["dy/component/BannerAd.tsx"],"mappings":"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","ignoreList":[]}
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, useCallback, useRef, useEffect, useMemo } from 'react';
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: 'BrayantBannerAdViewManager',
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
- // BannerAd is only supported on Android - Check before hooks
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 return after dismissed state is set (after hooks)
53
- if (dismissed) return null;
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: containerStyle,
96
- onAdError: handleError,
97
- onAdClick: handleClick,
98
- onAdDismiss: handleDismiss,
99
- onAdShow: handleShow,
100
- onAdRenderSuccess: handleRenderSuccess,
101
- onAdDislike: handleDislike
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","useCallback","useRef","useEffect","useMemo","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","OS","dismissed","setDismissed","height","setHeight","heightInitialized","current","Error","containerStyle","width","handleError","e","nativeEvent","handleClick","handleDismiss","handleShow","handleRenderSuccess","newHeight","handleDislike","createElement","memo","prevProps","nextProps"],"sourceRoot":"../../../../src","sources":["dy/component/BannerAd.tsx"],"mappings":"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","ignoreList":[]}
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?: Function;
10
- onAdError?: Function;
11
- onAdDismiss?: Function;
12
- onAdClick?: Function;
13
- onAdShow?: Function;
14
- onAdDislike?: Function;
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,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQ9C,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,QAAQ,CAAC;IAC7B,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,WAAW,CAAC,EAAE,QAAQ,CAAC;CACxB;0DAc4B,aAAa;AAqG1C,wBASG"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@24jieqi/react-native-brayant-ad",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "国内广告联盟sdk封装",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -1,25 +1,32 @@
1
- import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';
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: 'BrayantBannerAdViewManager',
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?: Function;
18
- onAdError?: Function;
19
- onAdDismiss?: Function;
20
- onAdClick?: Function;
21
- onAdShow?: Function;
22
- onAdDislike?: Function;
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 = ComponentName && UIManager.getViewManagerConfig(ComponentName) != null
34
- ? requireNativeComponent<BannerAdProps>(ComponentName)
35
- : undefined;
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
- // BannerAd is only supported on Android - Check before hooks
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 return after dismissed state is set (after hooks)
77
- if (dismissed) return null;
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={containerStyle}
128
- onAdError={handleError}
129
- onAdClick={handleClick}
130
- onAdDismiss={handleDismiss}
131
- onAdShow={handleShow}
132
- onAdRenderSuccess={handleRenderSuccess}
133
- onAdDislike={handleDislike}
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
-