adwhale-sdk-react-native 2.7.102 → 2.7.200

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/README.md CHANGED
@@ -43,16 +43,16 @@ npm install adwhale-sdk-react-native
43
43
  운영 안정성을 중시하는 경우
44
44
  ```json
45
45
  {
46
- "adwhale-sdk-react-native": "~2.7.102"
46
+ "adwhale-sdk-react-native": "~2.7.200"
47
47
  }
48
48
  ```
49
- - Android SDK 2.7.1 기반 유지
49
+ - Android SDK 2.7.2 기반 유지
50
50
  - RN 핫픽스만 자동 반영
51
51
 
52
52
  ### 동일한 Android SDK 기반의 최신 RN 수정만 사용
53
53
  ```json
54
54
  {
55
- "adwhale-sdk-react-native": "^2.7.102"
55
+ "adwhale-sdk-react-native": "^2.7.200"
56
56
  }
57
57
  ```
58
58
  - Android SDK 2.7.x 범위 내 최신 RN 수정 자동 반영
@@ -62,7 +62,7 @@ npm install adwhale-sdk-react-native
62
62
  ### 특정 버전을 완전히 고정하여 사용하는 경우
63
63
  ```json
64
64
  {
65
- "adwhale-sdk-react-native": "2.7.102"
65
+ "adwhale-sdk-react-native": "2.7.200"
66
66
  }
67
67
  ```
68
68
 
@@ -114,22 +114,25 @@ repositories {
114
114
 
115
115
  dependencies {
116
116
  implementation "com.facebook.react:react-android:0.81.1"
117
+ implementation 'androidx.lifecycle:lifecycle-process:2.6.2'
118
+ implementation 'androidx.lifecycle:lifecycle-runtime:2.6.2'
117
119
 
118
120
  // 기본 디펜던시: ADwhale Mediation SDK Repository
119
- implementation "net.adwhale.sdk.mediation:adwhale-mediation-sdk:2.7.1"
121
+ implementation "net.adwhale.sdk.mediation:adwhale-mediation-sdk:2.7.2"
120
122
 
121
123
  // 옵션 디펜던시(제외가능): Cauly Adapter SDK Repository
122
- implementation "net.adwhale.sdk.cauly.adapter:cauly-sdk:3.5.40.3"
124
+ implementation "net.adwhale.sdk.cauly.adapter:cauly-sdk:3.5.41.0"
123
125
 
124
126
  // 옵션 디펜던시(제외가능): Admize Adapter SDK Repository
125
- implementation "net.adwhale.sdk.admize.adapter:admize-sdk:1.0.7.1"
127
+ implementation "net.adwhale.sdk.admize.adapter:admize-sdk:1.0.8.0"
126
128
 
127
129
  // 옵션 디펜던시(제외가능): AdFit Adapter SDK Repository
128
- implementation "net.adwhale.sdk.adfit.adapter:adfit-sdk:3.17.2.4"
130
+ implementation "net.adwhale.sdk.adfit.adapter:adfit-sdk:3.17.2.5"
129
131
 
130
132
  // 옵션 디펜던시(제외가능): Admob Adapter SDK Repository
131
- implementation "net.adwhale.sdk.admob.adapter:admob-sdk:24.3.0.1"
133
+ implementation "net.adwhale.sdk.admob.adapter:admob-sdk:24.3.0.2"
132
134
 
133
135
  // 옵션 디펜던시(제외가능): Levelplay Adapter SDK Repository
134
- implementation "net.adwhale.sdk.levelplay.adapter:levelplay-sdk:8.7.0.5"
136
+ implementation "net.adwhale.sdk.levelplay.adapter:levelplay-sdk:8.7.0.6"
137
+
135
138
  }
@@ -136,6 +136,20 @@
136
136
 
137
137
  -keep interface net.adwhale.sdk.mediation.ads.AdWhaleMediationAdBannerViewListener {*;}
138
138
 
139
+ -keepclasseswithmembers class net.adwhale.sdk.mediation.ads.AdWhaleMediationAppOpenAd {
140
+ public <init>(...);
141
+ public *** loadAd();
142
+ public *** showAd(***);
143
+ public *** setRegion(***);
144
+ public *** setGcoder(***, ***);
145
+ public *** setPlacementUid(***);
146
+ public *** setPlacementName(***);
147
+ public *** destroy();
148
+ public *** setAdWhaleMediationAppOpenAdListener(***);
149
+ }
150
+
151
+ -keep interface net.adwhale.sdk.mediation.ads.AdWhaleMediationAppOpenAdListener {*;}
152
+
139
153
  #================== AdWhale Mediation SDK Proguard for Release 적용 코드 끝 ==================
140
154
 
141
155
  #================== AdWhale Cauly Adapter SDK Proguard for Release 적용 코드 시작 ==================
@@ -191,6 +205,7 @@
191
205
  -keep class net.adwhale.sdk.admob.adapter.AdManagerAdRewardLoader {*;}
192
206
 
193
207
  -keep class net.adwhale.sdk.admob.adapter.AdManagerAdRewardedInterstitialLoader {*;}
208
+ -keep class net.adwhale.sdk.admob.adapter.AdManagerAdAppOpeningLoader {*;}
194
209
 
195
210
  #================== AdWhale AdManager Adapter SDK Proguard for Release 적용 코드 끝 ==================
196
211
 
@@ -210,6 +225,8 @@
210
225
 
211
226
  -keep class net.adwhale.sdk.admob.adapter.AdmobAdRewardedInterstitialLoader {*;}
212
227
 
228
+ -keep class net.adwhale.sdk.admob.adapter.AdmobAdAppOpeningLoader {*;}
229
+
213
230
  -keep class net.adwhale.sdk.admob.adapter.custom.cauly.AdMobCaulyEvent {*;}
214
231
 
215
232
  -keep class net.adwhale.sdk.admob.adapter.custom.cauly.CaulyMediationBannerAd {*;}
@@ -41,6 +41,12 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
41
41
  if (RNAdWhaleMediationRewardAd.REACT_CLASS_NAME.equals(name)) {
42
42
  return new RNAdWhaleMediationRewardAd(reactContext);
43
43
  }
44
+
45
+ // 엡오프닝 Old Architecture를 따르지만 등록은 TurboModule로 등록
46
+ if(RNAdWhaleMediationAppOpenAd.REACT_CLASS_NAME.equals(name)) {
47
+ return new RNAdWhaleMediationAppOpenAd(reactContext);
48
+ }
49
+
44
50
  return null;
45
51
  }
46
52
 
@@ -52,7 +58,8 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
52
58
  return Arrays.<NativeModule>asList(
53
59
  new RNAdWhaleMediationLoggerModule(reactContext),
54
60
  new RNAdWhaleMediationInterstitialAd(reactContext),
55
- new RNAdWhaleMediationRewardAd(reactContext)
61
+ new RNAdWhaleMediationRewardAd(reactContext),
62
+ new RNAdWhaleMediationAppOpenAd(reactContext)
56
63
  // RNAdWhaleMediationAdSettingModule는 TurboModule로 등록되므로 여기서 굳이 추가 안 해도 됨
57
64
  );
58
65
  }
@@ -85,7 +92,7 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
85
92
  )
86
93
  );
87
94
 
88
- // 로거/전면/보상형은 legacy 모듈로 사용 (isTurboModule = false)
95
+ // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
89
96
  moduleInfos.put(
90
97
  RNAdWhaleMediationLoggerModule.REACT_CLASS_NAME,
91
98
  new ReactModuleInfo(
@@ -98,7 +105,7 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
98
105
  )
99
106
  );
100
107
 
101
- // 로거/전면/보상형은 legacy 모듈로 사용 (isTurboModule = false)
108
+ // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
102
109
  moduleInfos.put(
103
110
  RNAdWhaleMediationInterstitialAd.REACT_CLASS_NAME,
104
111
  new ReactModuleInfo(
@@ -111,7 +118,7 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
111
118
  )
112
119
  );
113
120
 
114
- // 로거/전면/보상형은 legacy 모듈로 사용 (isTurboModule = false)
121
+ // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
115
122
  moduleInfos.put(
116
123
  RNAdWhaleMediationRewardAd.REACT_CLASS_NAME,
117
124
  new ReactModuleInfo(
@@ -124,6 +131,19 @@ public class AdwhaleSdkReactNativePackage extends BaseReactPackage {
124
131
  )
125
132
  );
126
133
 
134
+ // 로거/전면/보상형/앱오프닝은 legacy 모듈로 사용 (isTurboModule = false)
135
+ moduleInfos.put(
136
+ RNAdWhaleMediationAppOpenAd.REACT_CLASS_NAME,
137
+ new ReactModuleInfo(
138
+ RNAdWhaleMediationAppOpenAd.REACT_CLASS_NAME,
139
+ RNAdWhaleMediationAppOpenAd.REACT_CLASS_NAME,
140
+ false,
141
+ false,
142
+ false,
143
+ false
144
+ )
145
+ );
146
+
127
147
  return moduleInfos;
128
148
  };
129
149
  }
@@ -0,0 +1,240 @@
1
+ package com.adwhalesdkreactnative;
2
+
3
+ import android.util.Log;
4
+
5
+ import androidx.annotation.NonNull;
6
+ import androidx.annotation.Nullable;
7
+ import androidx.lifecycle.DefaultLifecycleObserver;
8
+ import androidx.lifecycle.LifecycleOwner;
9
+ import androidx.lifecycle.ProcessLifecycleOwner;
10
+
11
+ import com.facebook.react.bridge.Arguments;
12
+ import com.facebook.react.bridge.LifecycleEventListener;
13
+ import com.facebook.react.bridge.ReactApplicationContext;
14
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
15
+ import com.facebook.react.bridge.ReactMethod;
16
+ import com.facebook.react.bridge.ReadableMap;
17
+ import com.facebook.react.bridge.UiThreadUtil;
18
+ import com.facebook.react.bridge.WritableMap;
19
+ import com.facebook.react.modules.core.DeviceEventManagerModule;
20
+
21
+ import net.adwhale.sdk.mediation.ads.AdWhaleMediationAppOpenAd;
22
+ import net.adwhale.sdk.mediation.ads.AdWhaleMediationAppOpenAdListener;
23
+
24
+ public class RNAdWhaleMediationAppOpenAd extends ReactContextBaseJavaModule implements AdWhaleMediationAppOpenAdListener, LifecycleEventListener {
25
+
26
+ public static final String REACT_CLASS_NAME = RNAdWhaleMediationAppOpenAd.class.getSimpleName();
27
+ private AdWhaleMediationAppOpenAd adWhaleMediationAppOpenAd;
28
+ private final ReactApplicationContext reactContext;
29
+
30
+ private boolean isAppInBackground = false;
31
+ private DefaultLifecycleObserver appLifecycleObserver;
32
+ private boolean isObserverSetup = false;
33
+
34
+ private String placementName;
35
+ private String region;
36
+ private double lt;
37
+ private double lng;
38
+
39
+ public RNAdWhaleMediationAppOpenAd(ReactApplicationContext context) {
40
+ super(context);
41
+ reactContext = context;
42
+ reactContext.addLifecycleEventListener(this);
43
+ }
44
+
45
+ private void setupLifecycleObserver() {
46
+ UiThreadUtil.runOnUiThread(() -> {
47
+ if (isObserverSetup) {
48
+ return;
49
+ }
50
+
51
+ appLifecycleObserver = new DefaultLifecycleObserver() {
52
+ @Override
53
+ public void onStart(@NonNull LifecycleOwner owner) {
54
+ Log.d(REACT_CLASS_NAME, "App moved to foreground");
55
+ if (adWhaleMediationAppOpenAd != null && isAppInBackground) {
56
+ if (getCurrentActivity() != null) {
57
+ adWhaleMediationAppOpenAd.showAd(getCurrentActivity());
58
+ }
59
+ }
60
+ isAppInBackground = false;
61
+ }
62
+
63
+ @Override
64
+ public void onStop(@NonNull LifecycleOwner owner) {
65
+ Log.d(REACT_CLASS_NAME, "App moved to background");
66
+ isAppInBackground = true;
67
+ }
68
+ };
69
+ ProcessLifecycleOwner.get().getLifecycle().addObserver(appLifecycleObserver);
70
+ isObserverSetup = true;
71
+ Log.d(REACT_CLASS_NAME, "ProcessLifecycleOwner observer setup successfully.");
72
+ });
73
+ }
74
+
75
+ private void release() {
76
+ UiThreadUtil.runOnUiThread(() -> {
77
+ if (appLifecycleObserver != null) {
78
+ ProcessLifecycleOwner.get().getLifecycle().removeObserver(appLifecycleObserver);
79
+ appLifecycleObserver = null;
80
+ isObserverSetup = false;
81
+ }
82
+ });
83
+ if (adWhaleMediationAppOpenAd != null) {
84
+ adWhaleMediationAppOpenAd.destroy();
85
+ adWhaleMediationAppOpenAd = null;
86
+ }
87
+ }
88
+
89
+ @NonNull
90
+ @Override
91
+ public String getName() {
92
+ return REACT_CLASS_NAME;
93
+ }
94
+
95
+ @ReactMethod
96
+ public void setPlacementName(String placementName) {
97
+ Log.e(REACT_CLASS_NAME, "placementName: " + placementName);
98
+ this.placementName = placementName;
99
+ }
100
+
101
+ @ReactMethod
102
+ public void setRegion(String region) {
103
+ Log.e(REACT_CLASS_NAME, "region: " + region);
104
+ this.region = region;
105
+ }
106
+
107
+ @ReactMethod
108
+ public void setGcoder(ReadableMap gcoderMap) {
109
+ Log.e(REACT_CLASS_NAME, "gcoderMap: " + gcoderMap);
110
+
111
+ if (gcoderMap != null) {
112
+ double lt = gcoderMap.hasKey("lt") ? gcoderMap.getDouble("lt") : 0.0;
113
+ double lng = gcoderMap.hasKey("lng") ? gcoderMap.getDouble("lng") : 0.0;
114
+
115
+ this.lt = lt;
116
+ this.lng = lng;
117
+ }
118
+ }
119
+
120
+ @ReactMethod
121
+ public void loadAd(String placementUid) {
122
+ Log.d(REACT_CLASS_NAME, "loadAd(" + placementUid + ")");
123
+ UiThreadUtil.runOnUiThread(() -> {
124
+ Log.d(REACT_CLASS_NAME, "runOnUiThread()");
125
+ if (getCurrentActivity() != null) {
126
+ if (adWhaleMediationAppOpenAd != null) {
127
+ adWhaleMediationAppOpenAd.destroy();
128
+ }
129
+ adWhaleMediationAppOpenAd = new AdWhaleMediationAppOpenAd(getCurrentActivity(), placementUid);
130
+ adWhaleMediationAppOpenAd.setAdWhaleMediationAppOpenAdListener(this);
131
+ adWhaleMediationAppOpenAd.setPlacementName(placementName);
132
+ adWhaleMediationAppOpenAd.setRegion(region);
133
+ adWhaleMediationAppOpenAd.setGcoder(lt, lng);
134
+ adWhaleMediationAppOpenAd.loadAd();
135
+ } else {
136
+ Log.e(REACT_CLASS_NAME, "Current Activity is null, cannot create AppOpenAd.");
137
+ WritableMap params = Arguments.createMap();
138
+ params.putInt("statusCode", -1);
139
+ params.putString("message", "Activity not available to load ad.");
140
+ sendEvent("onAppOpenAdFailedToLoad", params);
141
+ }
142
+ });
143
+ }
144
+
145
+ @ReactMethod
146
+ public void showAd() {
147
+ Log.d(REACT_CLASS_NAME, "showAd()");
148
+ UiThreadUtil.runOnUiThread(() -> {
149
+ if (adWhaleMediationAppOpenAd != null) {
150
+ if (getCurrentActivity() != null) {
151
+ adWhaleMediationAppOpenAd.showAd(getCurrentActivity());
152
+ } else {
153
+ Log.e(REACT_CLASS_NAME, "Current Activity is null, cannot show AppOpenAd.");
154
+ }
155
+ } else {
156
+ Log.e(REACT_CLASS_NAME, "adWhaleMediationAppOpenAd is not loaded yet.");
157
+ }
158
+ });
159
+ }
160
+
161
+ private void sendEvent(String eventName, @Nullable WritableMap params) {
162
+ if (reactContext.hasActiveCatalystInstance()) {
163
+ reactContext
164
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
165
+ .emit(eventName, params);
166
+ }
167
+ }
168
+
169
+ @Override
170
+ public void onAdLoaded() {
171
+ Log.i(REACT_CLASS_NAME, ".onAdLoaded()");
172
+ sendEvent("onAppOpenAdLoaded", null);
173
+ }
174
+
175
+ @Override
176
+ public void onAdFailedToLoad(int statusCode, String message) {
177
+ Log.e(REACT_CLASS_NAME, ".onAdFailedToLoad(" + statusCode + ", " + message + ")");
178
+ WritableMap params = Arguments.createMap();
179
+ params.putInt("statusCode", statusCode);
180
+ params.putString("message", message);
181
+ sendEvent("onAppOpenAdFailedToLoad", params);
182
+ }
183
+
184
+ @Override
185
+ public void onAdShowed() {
186
+ Log.i(REACT_CLASS_NAME, ".onAdShowed()");
187
+ sendEvent("onAppOpenAdShowed", null);
188
+ }
189
+
190
+ @Override
191
+ public void onAdFailedToShow(int statusCode, String message) {
192
+ Log.e(REACT_CLASS_NAME, ".onAdFailedToShow(" + statusCode + ", " + message + ")");
193
+ WritableMap params = Arguments.createMap();
194
+ params.putInt("statusCode", statusCode);
195
+ params.putString("message", message);
196
+ sendEvent("onAppOpenAdFailedToShow", params);
197
+ }
198
+
199
+ @Override
200
+ public void onAdDismissed() {
201
+ Log.i(REACT_CLASS_NAME, ".onAdDismissed()");
202
+ sendEvent("onAppOpenAdDismissed", null);
203
+ if (adWhaleMediationAppOpenAd != null) {
204
+ adWhaleMediationAppOpenAd.destroy();
205
+ adWhaleMediationAppOpenAd = null;
206
+ }
207
+ }
208
+
209
+ @Override
210
+ public void onAdClicked() {
211
+ Log.i(REACT_CLASS_NAME, ".onAdClicked()");
212
+ sendEvent("onAppOpenAdClicked", null);
213
+ }
214
+
215
+ @ReactMethod
216
+ public void addListener(String eventName) {
217
+ // Keep: Required for RN built in Event Emitter Calls.
218
+ }
219
+
220
+ @ReactMethod
221
+ public void removeListeners(Integer count) {
222
+ // Keep: Required for RN built in Event Emitter Calls.
223
+ }
224
+
225
+ @Override
226
+ public void onHostResume() {
227
+ setupLifecycleObserver();
228
+ }
229
+
230
+ @Override
231
+ public void onHostPause() {
232
+
233
+ }
234
+
235
+ @Override
236
+ public void onHostDestroy() {
237
+ release();
238
+ reactContext.removeLifecycleEventListener(this);
239
+ }
240
+ }
@@ -7,6 +7,7 @@ import androidx.annotation.NonNull;
7
7
  import com.facebook.react.bridge.ReactApplicationContext;
8
8
  import com.facebook.react.bridge.ReactContextBaseJavaModule;
9
9
  import com.facebook.react.bridge.ReactMethod;
10
+ import com.facebook.react.bridge.Promise;
10
11
  import net.adwhale.sdk.utils.AdWhaleLog;
11
12
 
12
13
  public class RNAdWhaleMediationLoggerModule extends ReactContextBaseJavaModule {
@@ -32,4 +33,17 @@ public class RNAdWhaleMediationLoggerModule extends ReactContextBaseJavaModule {
32
33
  AdWhaleLog.setLogLevel(AdWhaleLog.LogLevel.None);
33
34
  }
34
35
  }
36
+
37
+ @ReactMethod
38
+ public void getLogLevel(Promise promise) {
39
+ try {
40
+ AdWhaleLog.LogLevel logLevel = AdWhaleLog.getLogLevel();
41
+ String logLevelString = logLevel.toString();
42
+ Log.d(REACT_CLASS_NAME, "현재 로그 레벨: " + logLevelString);
43
+ promise.resolve(logLevelString);
44
+ } catch (Exception e) {
45
+ Log.e(REACT_CLASS_NAME, "로그 레벨 조회 실패", e);
46
+ promise.reject("GET_LOG_LEVEL_ERROR", "Failed to get log level", e);
47
+ }
48
+ }
35
49
  }
@@ -287,6 +287,8 @@ public class RNAdWhaleMediationTemplateNativeAdView extends SimpleViewManager<RN
287
287
  this.template = ADWHALE_NATIVE_TEMPLATE.SMALL;
288
288
  } else if ("MEDIUM".equalsIgnoreCase(templateName)) {
289
289
  this.template = ADWHALE_NATIVE_TEMPLATE.MEDIUM;
290
+ } else if ("FULLSCREEN".equalsIgnoreCase(templateName)) {
291
+ this.template = ADWHALE_NATIVE_TEMPLATE.FULLSCREEN;
290
292
  }
291
293
  }
292
294
 
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ // src/AdWhaleAppOpenAd.ts
4
+ import { NativeEventEmitter, NativeModules } from 'react-native';
5
+ const {
6
+ RNAdWhaleMediationAppOpenAd
7
+ } = NativeModules;
8
+ const appOpenEmitter = new NativeEventEmitter(RNAdWhaleMediationAppOpenAd);
9
+ export const AdWhaleAppOpenAd = {
10
+ loadAd(placementUid, options) {
11
+ // 먼저 옵션들을 설정
12
+ if (options?.placementName) {
13
+ RNAdWhaleMediationAppOpenAd.setPlacementName(options.placementName);
14
+ }
15
+ if (options?.region) {
16
+ RNAdWhaleMediationAppOpenAd.setRegion(options.region);
17
+ }
18
+ if (options?.gcoder) {
19
+ RNAdWhaleMediationAppOpenAd.setGcoder(options.gcoder);
20
+ }
21
+ // 그 다음 loadAd 호출
22
+ RNAdWhaleMediationAppOpenAd.loadAd(placementUid);
23
+ },
24
+ showAd() {
25
+ RNAdWhaleMediationAppOpenAd.showAd();
26
+ },
27
+ addEventListeners(listeners) {
28
+ const subs = [];
29
+ if (listeners.onLoaded) {
30
+ subs.push(appOpenEmitter.addListener('onAppOpenAdLoaded', () => {
31
+ listeners.onLoaded?.();
32
+ }));
33
+ }
34
+ if (listeners.onLoadFailed) {
35
+ subs.push(appOpenEmitter.addListener('onAppOpenAdFailedToLoad', event => listeners.onLoadFailed?.(event)));
36
+ }
37
+ if (listeners.onShowed) {
38
+ subs.push(appOpenEmitter.addListener('onAppOpenAdShowed', () => {
39
+ listeners.onShowed?.();
40
+ }));
41
+ }
42
+ if (listeners.onShowFailed) {
43
+ subs.push(appOpenEmitter.addListener('onAppOpenAdFailedToShow', event => listeners.onShowFailed?.(event)));
44
+ }
45
+ if (listeners.onDismissed) {
46
+ subs.push(appOpenEmitter.addListener('onAppOpenAdDismissed', () => {
47
+ listeners.onDismissed?.();
48
+ }));
49
+ }
50
+ if (listeners.onClicked) {
51
+ subs.push(appOpenEmitter.addListener('onAppOpenAdClicked', () => {
52
+ listeners.onClicked?.();
53
+ }));
54
+ }
55
+ return subs;
56
+ }
57
+ };
58
+ //# sourceMappingURL=AdWhaleAppOpenAd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeEventEmitter","NativeModules","RNAdWhaleMediationAppOpenAd","appOpenEmitter","AdWhaleAppOpenAd","loadAd","placementUid","options","placementName","setPlacementName","region","setRegion","gcoder","setGcoder","showAd","addEventListeners","listeners","subs","onLoaded","push","addListener","onLoadFailed","event","onShowed","onShowFailed","onDismissed","onClicked"],"sourceRoot":"../../src","sources":["AdWhaleAppOpenAd.ts"],"mappings":";;AAAA;AACA,SAASA,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;AAgChE,MAAM;EAAEC;AAA4B,CAAC,GAAGD,aAEvC;AAED,MAAME,cAAc,GAAG,IAAIH,kBAAkB,CAACE,2BAA2B,CAAC;AAE1E,OAAO,MAAME,gBAAgB,GAAG;EAC9BC,MAAMA,CACJC,YAAoB,EACpBC,OAIC,EACD;IACA;IACA,IAAIA,OAAO,EAAEC,aAAa,EAAE;MAC1BN,2BAA2B,CAACO,gBAAgB,CAACF,OAAO,CAACC,aAAa,CAAC;IACrE;IACA,IAAID,OAAO,EAAEG,MAAM,EAAE;MACnBR,2BAA2B,CAACS,SAAS,CAACJ,OAAO,CAACG,MAAM,CAAC;IACvD;IACA,IAAIH,OAAO,EAAEK,MAAM,EAAE;MACnBV,2BAA2B,CAACW,SAAS,CAACN,OAAO,CAACK,MAAM,CAAC;IACvD;IACA;IACAV,2BAA2B,CAACG,MAAM,CAACC,YAAY,CAAC;EAClD,CAAC;EAEDQ,MAAMA,CAAA,EAAG;IACPZ,2BAA2B,CAACY,MAAM,CAAC,CAAC;EACtC,CAAC;EAEDC,iBAAiBA,CAACC,SAA+B,EAAyB;IACxE,MAAMC,IAA2B,GAAG,EAAE;IAEtC,IAAID,SAAS,CAACE,QAAQ,EAAE;MACtBD,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CAAC,mBAAmB,EAAE,MAAM;QACpDJ,SAAS,CAACE,QAAQ,GAAG,CAAC;MACxB,CAAC,CACH,CAAC;IACH;IACA,IAAIF,SAAS,CAACK,YAAY,EAAE;MAC1BJ,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CACxB,yBAAyB,EACzBE,KAAK,IAAIN,SAAS,CAACK,YAAY,GAAGC,KAAiC,CACrE,CACF,CAAC;IACH;IACA,IAAIN,SAAS,CAACO,QAAQ,EAAE;MACtBN,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CAAC,mBAAmB,EAAE,MAAM;QACpDJ,SAAS,CAACO,QAAQ,GAAG,CAAC;MACxB,CAAC,CACH,CAAC;IACH;IACA,IAAIP,SAAS,CAACQ,YAAY,EAAE;MAC1BP,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CACxB,yBAAyB,EACzBE,KAAK,IAAIN,SAAS,CAACQ,YAAY,GAAGF,KAAiC,CACrE,CACF,CAAC;IACH;IACA,IAAIN,SAAS,CAACS,WAAW,EAAE;MACzBR,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CAAC,sBAAsB,EAAE,MAAM;QACvDJ,SAAS,CAACS,WAAW,GAAG,CAAC;MAC3B,CAAC,CACH,CAAC;IACH;IACA,IAAIT,SAAS,CAACU,SAAS,EAAE;MACvBT,IAAI,CAACE,IAAI,CACPhB,cAAc,CAACiB,WAAW,CAAC,oBAAoB,EAAE,MAAM;QACrDJ,SAAS,CAACU,SAAS,GAAG,CAAC;MACzB,CAAC,CACH,CAAC;IACH;IAEA,OAAOT,IAAI;EACb;AACF,CAAC","ignoreList":[]}
@@ -32,6 +32,12 @@ export const AdWhaleMediationSdk = {
32
32
  setLoggerEnabled(enabled) {
33
33
  RNAdWhaleMediationLoggerModule?.setLogLevel?.(enabled);
34
34
  },
35
+ getLogLevel() {
36
+ if (!RNAdWhaleMediationLoggerModule?.getLogLevel) {
37
+ return Promise.reject(new Error('getLogLevel is not implemented in native module'));
38
+ }
39
+ return RNAdWhaleMediationLoggerModule.getLogLevel();
40
+ },
35
41
  setCoppa(enabled) {
36
42
  console.log('[AdWhaleMediationSdk] setCoppa called:', enabled);
37
43
  if (!AdwhaleSdkReactNative?.setCoppa) {
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","Platform","NativeAdwhaleSdkReactNative","LINKING_ERROR","OS","RNAdWhaleMediationLoggerModule","AdwhaleSdkReactNative","console","warn","log","hasInitialize","initialize","hasRequestGdprConsent","requestGdprConsent","hasGetConsentStatus","getConsentStatus","hasResetGdprConsentStatus","resetGdprConsentStatus","hasSetGdpr","setGdpr","hasSetCoppa","setCoppa","AdWhaleMediationSdk","Promise","reject","Error","setLoggerEnabled","enabled","setLogLevel","error","consent"],"sourceRoot":"../../src","sources":["AdWhaleMediationSdk.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeModules","Platform","NativeAdwhaleSdkReactNative","LINKING_ERROR","OS","RNAdWhaleMediationLoggerModule","AdwhaleSdkReactNative","console","warn","log","hasInitialize","initialize","hasRequestGdprConsent","requestGdprConsent","hasGetConsentStatus","getConsentStatus","hasResetGdprConsentStatus","resetGdprConsentStatus","hasSetGdpr","setGdpr","hasSetCoppa","setCoppa","AdWhaleMediationSdk","Promise","reject","Error","setLoggerEnabled","enabled","setLogLevel","getLogLevel","error","consent"],"sourceRoot":"../../src","sources":["AdWhaleMediationSdk.ts"],"mappings":"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","ignoreList":[]}
@@ -19,9 +19,11 @@ export { AdWhaleBannerView } from "./AdWhaleBannerView.js";
19
19
  export { AdWhaleInterstitialAd } from "./AdWhaleInterstitialAd.js";
20
20
  // ✅ 4) 리워드 광고 API
21
21
  export { AdWhaleRewardAd } from "./AdWhaleRewardAd.js";
22
- // ✅ 5) 네이티브 커스텀 (네이티브 템플릿/커스텀용)
22
+ // ✅ 5) 오프닝 광고 API
23
+ export { AdWhaleAppOpenAd } from "./AdWhaleAppOpenAd.js";
24
+ // ✅ 6) 네이티브 커스텀 뷰 (네이티브 템플릿/커스텀용)
23
25
  export { AdWhaleNativeCustomView } from "./AdWhaleNativeCustomView.js";
24
- // ✅ 6) (선택) 네이티브 템플릿 뷰가 있다면 그대로 유지
26
+ // ✅ 7) (선택) 네이티브 템플릿 뷰가 있다면 그대로 유지
25
27
  // 파일이 실제로 있다면 그대로 유효하고,
26
28
  // 나중에 뺄 거면 여기 export 한 줄만 지우면 됨.
27
29
  export * from "./AdWhaleNativeTemplateView.js";
@@ -1 +1 @@
1
- {"version":3,"names":["AdWhaleMediationSdk","AdWhaleBannerView","AdWhaleInterstitialAd","AdWhaleRewardAd","AdWhaleNativeCustomView"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;;AAEA;AACA,SAASA,mBAAmB,QAAQ,0BAAuB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA,SACEC,iBAAiB,QACZ,wBAAqB;AAQ5B;AACA,SACEC,qBAAqB,QAChB,4BAAyB;AAOhC;AACA,SACEC,eAAe,QACV,sBAAmB;AAQ1B;AACA,SACEC,uBAAuB,QAClB,8BAA2B;AAQlC;AACA;AACA;AACA,cAAc,gCAA6B","ignoreList":[]}
1
+ {"version":3,"names":["AdWhaleMediationSdk","AdWhaleBannerView","AdWhaleInterstitialAd","AdWhaleRewardAd","AdWhaleAppOpenAd","AdWhaleNativeCustomView"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;;AAEA;AACA,SAASA,mBAAmB,QAAQ,0BAAuB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA,SACEC,iBAAiB,QACZ,wBAAqB;AAQ5B;AACA,SACEC,qBAAqB,QAChB,4BAAyB;AAOhC;AACA,SACEC,eAAe,QACV,sBAAmB;AAQ1B;AACA,SACEC,gBAAgB,QACX,uBAAoB;AAO3B;AACA,SACEC,uBAAuB,QAClB,8BAA2B;AAQlC;AACA;AACA;AACA,cAAc,gCAA6B","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ import type { EmitterSubscription } from 'react-native';
2
+ export interface AdWhaleAppOpenErrorEvent {
3
+ statusCode: number;
4
+ message: string;
5
+ }
6
+ export interface AdWhaleAppOpenEvents {
7
+ onLoaded?: () => void;
8
+ onLoadFailed?: (event: AdWhaleAppOpenErrorEvent) => void;
9
+ onShowed?: () => void;
10
+ onShowFailed?: (event: AdWhaleAppOpenErrorEvent) => void;
11
+ onDismissed?: () => void;
12
+ onClicked?: () => void;
13
+ }
14
+ export interface AdWhaleAppOpenAdGcoder {
15
+ lt: number;
16
+ lng: number;
17
+ }
18
+ export declare const AdWhaleAppOpenAd: {
19
+ loadAd(placementUid: string, options?: {
20
+ placementName?: string;
21
+ region?: string;
22
+ gcoder?: AdWhaleAppOpenAdGcoder;
23
+ }): void;
24
+ showAd(): void;
25
+ addEventListeners(listeners: AdWhaleAppOpenEvents): EmitterSubscription[];
26
+ };
27
+ //# sourceMappingURL=AdWhaleAppOpenAd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdWhaleAppOpenAd.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleAppOpenAd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAkBD,eAAO,MAAM,gBAAgB;yBAEX,MAAM,YACV;QACR,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,sBAAsB,CAAC;KACjC;;iCAoB0B,oBAAoB,GAAG,mBAAmB,EAAE;CAkD1E,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export declare const AdWhaleMediationSdk: {
2
2
  initialize(): Promise<number>;
3
3
  setLoggerEnabled(enabled: boolean): void;
4
+ getLogLevel(): Promise<string>;
4
5
  setCoppa(enabled: boolean): void;
5
6
  requestGdprConsent(): Promise<{
6
7
  isSuccess: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"AdWhaleMediationSdk.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleMediationSdk.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,mBAAmB;kBAChB,OAAO,CAAC,MAAM,CAAC;8BAOH,OAAO;sBAIf,OAAO;0BASH,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;wBAUlD,OAAO,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC;;qBAmBe,OAAO;CAQzB,CAAC"}
1
+ {"version":3,"file":"AdWhaleMediationSdk.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleMediationSdk.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,mBAAmB;kBAChB,OAAO,CAAC,MAAM,CAAC;8BAOH,OAAO;mBAIlB,OAAO,CAAC,MAAM,CAAC;sBASZ,OAAO;0BASH,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;wBAUlD,OAAO,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC;;qBAmBe,OAAO;CAQzB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { StyleProp, ViewStyle } from 'react-native';
3
- export type AdWhaleNativeTemplateType = 'SMALL' | 'MEDIUM';
3
+ export type AdWhaleNativeTemplateType = 'SMALL' | 'MEDIUM' | 'FULLSCREEN';
4
4
  export interface AdWhaleNativeTemplateStyle {
5
5
  mainBackgroundColor?: string;
6
6
  primaryTextTypefaceColor?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"AdWhaleNativeTemplateView.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleNativeTemplateView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,KAAK,EAEV,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,0BAA0B;IACzC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxC,qBAAqB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1C,wBAAwB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC9C;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,2BAA2B,CAAC;IACrC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAE3C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC/D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,IAAI,IAAI,CAAC;CAChB;AAkBD,eAAO,MAAM,yBAAyB,oHAmDpC,CAAC"}
1
+ {"version":3,"file":"AdWhaleNativeTemplateView.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleNativeTemplateView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,KAAK,EAEV,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE1E,MAAM,WAAW,0BAA0B;IACzC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxC,qBAAqB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1C,wBAAwB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC9C;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,2BAA2B,CAAC;IACrC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAE3C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC/D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,IAAI,IAAI,CAAC;CAChB;AAkBD,eAAO,MAAM,yBAAyB,oHAmDpC,CAAC"}
@@ -5,6 +5,8 @@ export { AdWhaleInterstitialAd, } from './AdWhaleInterstitialAd';
5
5
  export type { AdWhaleInterstitialErrorEvent, AdWhaleInterstitialEvents, } from './AdWhaleInterstitialAd';
6
6
  export { AdWhaleRewardAd, } from './AdWhaleRewardAd';
7
7
  export type { AdWhaleRewardErrorEvent, AdWhaleRewardUserRewardedEvent, AdWhaleRewardEvents, } from './AdWhaleRewardAd';
8
+ export { AdWhaleAppOpenAd, } from './AdWhaleAppOpenAd';
9
+ export type { AdWhaleAppOpenErrorEvent, AdWhaleAppOpenEvents, } from './AdWhaleAppOpenAd';
8
10
  export { AdWhaleNativeCustomView, } from './AdWhaleNativeCustomView';
9
11
  export type { AdWhaleNativeCustomHandle, AdWhaleNativeCustomViewProps, AdWhaleNativeCustomError, } from './AdWhaleNativeCustomView';
10
12
  export * from './AdWhaleNativeTemplateView';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAY5D,OAAO,EACL,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EACL,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAMnC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAY5D,OAAO,EACL,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EACL,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACL,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAMnC,cAAc,6BAA6B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adwhale-sdk-react-native",
3
- "version": "2.7.102",
3
+ "version": "2.7.200",
4
4
  "description": "Adwhale SDK React Native library for integrating Adwhale advertising mediation SDK into React Native applications.",
5
5
  "main": "./lib/module/index.js",
6
6
  "react-native": "./lib/module/index.js",
@@ -30,6 +30,7 @@
30
30
  "!android/gradlew",
31
31
  "!android/gradlew.bat",
32
32
  "!android/local.properties",
33
+ "!android/build.gradle.backup",
33
34
  "!**/__tests__",
34
35
  "!**/__fixtures__",
35
36
  "!**/__mocks__",
@@ -42,7 +43,9 @@
42
43
  "typecheck": "tsc",
43
44
  "lint": "eslint \"**/*.{js,ts,tsx}\"",
44
45
  "release": "release-it --only-version",
45
- "test": "jest"
46
+ "test": "jest",
47
+ "prepack": "node scripts/prepack-build-gradle.js",
48
+ "postpack": "node scripts/postpack-build-gradle.js"
46
49
  },
47
50
  "keywords": [
48
51
  "react-native",
package/plugin/index.js CHANGED
@@ -1,11 +1,142 @@
1
1
  // plugin/index.js
2
- const { createRunOncePlugin } = require('@expo/config-plugins');
2
+ const { createRunOncePlugin, withAndroidBuildGradle } = require('@expo/config-plugins');
3
3
  const pkg = require('../package.json');
4
4
 
5
- // Expo config plugin (no-op)
6
- // - Expo prebuild 시 호출되지만, 실제로는 config를 그대로 반환만 함.
5
+ // Maven repository URLs to add
6
+ const MAVEN_REPOSITORIES = [
7
+ {
8
+ comment: 'AdWhale SDK Repository Public Access Info',
9
+ url: 'https://dev-adwhale.github.io/adwhale-sdk-android-maven/maven-repo',
10
+ },
11
+ {
12
+ comment: 'Cauly SDK Repository Public Access Info',
13
+ url: 'https://cauly.github.io/cauly-sdk-android-maven/maven-repo',
14
+ },
15
+ {
16
+ comment: 'Admize SDK Repository Public Access Info',
17
+ url: 'https://cauly.github.io/admize-sdk-android-maven/maven-repo',
18
+ },
19
+ {
20
+ comment: 'AdFit SDK Repository Public Access Info',
21
+ url: 'https://devrepo.kakao.com/nexus/content/groups/public/',
22
+ },
23
+ ];
24
+
25
+ /**
26
+ * Generate maven repositories block content
27
+ */
28
+ function generateMavenRepositories(indent = ' ') {
29
+ return MAVEN_REPOSITORIES.map(
30
+ (repo) => `${indent}// ${repo.comment}\n${indent}maven { url "${repo.url}" }`
31
+ ).join('\n\n');
32
+ }
33
+
34
+ /**
35
+ * Add maven repositories to Android build.gradle
36
+ * This modifies the allprojects { repositories { ... } } block
37
+ */
38
+ const withAdwhaleMavenRepositories = (config) => {
39
+ return withAndroidBuildGradle(config, (config) => {
40
+ let buildGradle = config.modResults.contents;
41
+
42
+ // Check if allprojects block exists
43
+ if (!buildGradle.includes('allprojects')) {
44
+ // If allprojects doesn't exist, add it at the end
45
+ const repositoriesBlock = `
46
+
47
+ allprojects {
48
+ repositories {
49
+ google()
50
+ mavenCentral()
51
+
52
+ ${generateMavenRepositories()}
53
+ }
54
+ }`;
55
+ config.modResults.contents = buildGradle + repositoriesBlock;
56
+ return config;
57
+ }
58
+
59
+ // allprojects exists, check if repositories block exists inside it
60
+ const allprojectsRepositoriesRegex = /allprojects\s*\{[\s\S]*?repositories\s*\{/;
61
+
62
+ if (!allprojectsRepositoriesRegex.test(buildGradle)) {
63
+ // allprojects exists but no repositories block, add it
64
+ const repositoriesBlock = ` repositories {
65
+ google()
66
+ mavenCentral()
67
+
68
+ ${generateMavenRepositories(' ')}
69
+
70
+ }`;
71
+
72
+ // Insert repositories block after allprojects {
73
+ buildGradle = buildGradle.replace(
74
+ /(allprojects\s*\{)/,
75
+ `$1\n${repositoriesBlock}`
76
+ );
77
+ config.modResults.contents = buildGradle;
78
+ return config;
79
+ }
80
+
81
+ // allprojects { repositories { ... } } exists, add missing repositories
82
+ // Ensure google() exists in allprojects.repositories
83
+ const googleInAllprojectsRegex = /allprojects\s*\{[\s\S]*?repositories\s*\{[\s\S]*?google\(\)/;
84
+ if (!googleInAllprojectsRegex.test(buildGradle)) {
85
+ buildGradle = buildGradle.replace(
86
+ /(allprojects\s*\{[\s\S]*?repositories\s*\{)/,
87
+ '$1\n google()'
88
+ );
89
+ }
90
+
91
+ // Ensure mavenCentral() exists in allprojects.repositories
92
+ const mavenCentralInAllprojectsRegex = /allprojects\s*\{[\s\S]*?repositories\s*\{[\s\S]*?mavenCentral\(\)/;
93
+ if (!mavenCentralInAllprojectsRegex.test(buildGradle)) {
94
+ if (googleInAllprojectsRegex.test(buildGradle)) {
95
+ buildGradle = buildGradle.replace(
96
+ /(allprojects\s*\{[\s\S]*?repositories\s*\{[\s\S]*?google\(\))/,
97
+ '$1\n mavenCentral()'
98
+ );
99
+ } else {
100
+ buildGradle = buildGradle.replace(
101
+ /(allprojects\s*\{[\s\S]*?repositories\s*\{)/,
102
+ '$1\n mavenCentral()'
103
+ );
104
+ }
105
+ }
106
+
107
+ // Add each maven repository if it doesn't exist
108
+ MAVEN_REPOSITORIES.forEach((repo) => {
109
+ const urlEscaped = repo.url.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
110
+ const urlInAllprojectsRegex = new RegExp(
111
+ `allprojects\\s*\\{[\\s\\S]*?repositories\\s*\\{[\\s\\S]*?${urlEscaped}`
112
+ );
113
+
114
+ if (!urlInAllprojectsRegex.test(buildGradle)) {
115
+ // Add after mavenCentral() if it exists in allprojects.repositories
116
+ if (mavenCentralInAllprojectsRegex.test(buildGradle)) {
117
+ buildGradle = buildGradle.replace(
118
+ /(allprojects\s*\{[\s\S]*?repositories\s*\{[\s\S]*?mavenCentral\(\))/,
119
+ `$1\n\n // ${repo.comment}\n maven { url "${repo.url}" }`
120
+ );
121
+ } else {
122
+ // Add after repositories {
123
+ buildGradle = buildGradle.replace(
124
+ /(allprojects\s*\{[\s\S]*?repositories\s*\{)/,
125
+ `$1\n // ${repo.comment}\n maven { url "${repo.url}" }`
126
+ );
127
+ }
128
+ }
129
+ });
130
+
131
+ config.modResults.contents = buildGradle;
132
+ return config;
133
+ });
134
+ };
135
+
136
+ // Expo config plugin
7
137
  const withAdwhaleSdkReactNative = (config, props = {}) => {
8
- // 나중에 필요해지면 여기서 AndroidManifest / build.gradle 수정 로직만 추가하면 됨.
138
+ // Android build.gradle maven repositories 추가
139
+ config = withAdwhaleMavenRepositories(config);
9
140
  return config;
10
141
  };
11
142
 
@@ -0,0 +1,118 @@
1
+ // src/AdWhaleAppOpenAd.ts
2
+ import { NativeEventEmitter, NativeModules } from 'react-native';
3
+ import type { EmitterSubscription } from 'react-native';
4
+
5
+ export interface AdWhaleAppOpenErrorEvent {
6
+ statusCode: number;
7
+ message: string;
8
+ }
9
+
10
+ export interface AdWhaleAppOpenEvents {
11
+ onLoaded?: () => void;
12
+ onLoadFailed?: (event: AdWhaleAppOpenErrorEvent) => void;
13
+ onShowed?: () => void;
14
+ onShowFailed?: (event: AdWhaleAppOpenErrorEvent) => void;
15
+ onDismissed?: () => void;
16
+ onClicked?: () => void;
17
+ }
18
+
19
+ export interface AdWhaleAppOpenAdGcoder {
20
+ lt: number;
21
+ lng: number;
22
+ }
23
+
24
+ interface RNAdWhaleMediationAppOpenAdNativeModule {
25
+ setPlacementName(placementName: string): void;
26
+ setRegion(region: string): void;
27
+ setGcoder(gcoder: { lt: number; lng: number }): void;
28
+ loadAd(placementUid: string): void;
29
+ showAd(): void;
30
+ addListener(eventName: string): void;
31
+ removeListeners(count: number): void;
32
+ }
33
+
34
+ const { RNAdWhaleMediationAppOpenAd } = NativeModules as {
35
+ RNAdWhaleMediationAppOpenAd: RNAdWhaleMediationAppOpenAdNativeModule;
36
+ };
37
+
38
+ const appOpenEmitter = new NativeEventEmitter(RNAdWhaleMediationAppOpenAd);
39
+
40
+ export const AdWhaleAppOpenAd = {
41
+ loadAd(
42
+ placementUid: string,
43
+ options?: {
44
+ placementName?: string;
45
+ region?: string;
46
+ gcoder?: AdWhaleAppOpenAdGcoder;
47
+ },
48
+ ) {
49
+ // 먼저 옵션들을 설정
50
+ if (options?.placementName) {
51
+ RNAdWhaleMediationAppOpenAd.setPlacementName(options.placementName);
52
+ }
53
+ if (options?.region) {
54
+ RNAdWhaleMediationAppOpenAd.setRegion(options.region);
55
+ }
56
+ if (options?.gcoder) {
57
+ RNAdWhaleMediationAppOpenAd.setGcoder(options.gcoder);
58
+ }
59
+ // 그 다음 loadAd 호출
60
+ RNAdWhaleMediationAppOpenAd.loadAd(placementUid);
61
+ },
62
+
63
+ showAd() {
64
+ RNAdWhaleMediationAppOpenAd.showAd();
65
+ },
66
+
67
+ addEventListeners(listeners: AdWhaleAppOpenEvents): EmitterSubscription[] {
68
+ const subs: EmitterSubscription[] = [];
69
+
70
+ if (listeners.onLoaded) {
71
+ subs.push(
72
+ appOpenEmitter.addListener('onAppOpenAdLoaded', () => {
73
+ listeners.onLoaded?.();
74
+ }),
75
+ );
76
+ }
77
+ if (listeners.onLoadFailed) {
78
+ subs.push(
79
+ appOpenEmitter.addListener(
80
+ 'onAppOpenAdFailedToLoad',
81
+ event => listeners.onLoadFailed?.(event as AdWhaleAppOpenErrorEvent),
82
+ ),
83
+ );
84
+ }
85
+ if (listeners.onShowed) {
86
+ subs.push(
87
+ appOpenEmitter.addListener('onAppOpenAdShowed', () => {
88
+ listeners.onShowed?.();
89
+ }),
90
+ );
91
+ }
92
+ if (listeners.onShowFailed) {
93
+ subs.push(
94
+ appOpenEmitter.addListener(
95
+ 'onAppOpenAdFailedToShow',
96
+ event => listeners.onShowFailed?.(event as AdWhaleAppOpenErrorEvent),
97
+ ),
98
+ );
99
+ }
100
+ if (listeners.onDismissed) {
101
+ subs.push(
102
+ appOpenEmitter.addListener('onAppOpenAdDismissed', () => {
103
+ listeners.onDismissed?.();
104
+ }),
105
+ );
106
+ }
107
+ if (listeners.onClicked) {
108
+ subs.push(
109
+ appOpenEmitter.addListener('onAppOpenAdClicked', () => {
110
+ listeners.onClicked?.();
111
+ }),
112
+ );
113
+ }
114
+
115
+ return subs;
116
+ },
117
+ };
118
+
@@ -12,6 +12,7 @@ const LINKING_ERROR =
12
12
 
13
13
  interface RNAdWhaleMediationLoggerModule {
14
14
  setLogLevel?(enabled: boolean): void;
15
+ getLogLevel?(): Promise<string>;
15
16
  }
16
17
 
17
18
  const { RNAdWhaleMediationLoggerModule } = NativeModules as {
@@ -46,6 +47,15 @@ export const AdWhaleMediationSdk = {
46
47
  RNAdWhaleMediationLoggerModule?.setLogLevel?.(enabled);
47
48
  },
48
49
 
50
+ getLogLevel(): Promise<string> {
51
+ if (!RNAdWhaleMediationLoggerModule?.getLogLevel) {
52
+ return Promise.reject(
53
+ new Error('getLogLevel is not implemented in native module')
54
+ );
55
+ }
56
+ return RNAdWhaleMediationLoggerModule.getLogLevel();
57
+ },
58
+
49
59
  setCoppa(enabled: boolean) {
50
60
  console.log('[AdWhaleMediationSdk] setCoppa called:', enabled);
51
61
  if (!AdwhaleSdkReactNative?.setCoppa) {
@@ -7,7 +7,7 @@ import type {
7
7
  ViewStyle,
8
8
  } from 'react-native';
9
9
 
10
- export type AdWhaleNativeTemplateType = 'SMALL' | 'MEDIUM';
10
+ export type AdWhaleNativeTemplateType = 'SMALL' | 'MEDIUM' | 'FULLSCREEN';
11
11
 
12
12
  export interface AdWhaleNativeTemplateStyle {
13
13
  mainBackgroundColor?: string;
package/src/index.ts CHANGED
@@ -44,7 +44,17 @@ export type {
44
44
  } from './AdWhaleRewardAd';
45
45
 
46
46
 
47
- // ✅ 5) 네이티브 커스텀 (네이티브 템플릿/커스텀용)
47
+ // ✅ 5) 오프닝 광고 API
48
+ export {
49
+ AdWhaleAppOpenAd,
50
+ } from './AdWhaleAppOpenAd';
51
+ export type {
52
+ AdWhaleAppOpenErrorEvent,
53
+ AdWhaleAppOpenEvents,
54
+ } from './AdWhaleAppOpenAd';
55
+
56
+
57
+ // ✅ 6) 네이티브 커스텀 뷰 (네이티브 템플릿/커스텀용)
48
58
  export {
49
59
  AdWhaleNativeCustomView,
50
60
  } from './AdWhaleNativeCustomView';
@@ -55,7 +65,7 @@ export type {
55
65
  } from './AdWhaleNativeCustomView';
56
66
 
57
67
 
58
- // ✅ 6) (선택) 네이티브 템플릿 뷰가 있다면 그대로 유지
68
+ // ✅ 7) (선택) 네이티브 템플릿 뷰가 있다면 그대로 유지
59
69
  // 파일이 실제로 있다면 그대로 유효하고,
60
70
  // 나중에 뺄 거면 여기 export 한 줄만 지우면 됨.
61
71
  export * from './AdWhaleNativeTemplateView';