adwhale-sdk-react-native 2.7.204 → 2.7.300
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/AdwhaleSdkReactNative.podspec +22 -0
- package/README.md +80 -37
- package/android/proguard-rules.pro +56 -0
- package/android/src/main/java/com/adwhalesdkreactnative/AdWhaleCustomNativeBinderFactory.java +18 -0
- package/android/src/main/java/com/adwhalesdkreactnative/AdwhaleSdkReactNativePackage.java +51 -6
- package/android/src/main/java/com/adwhalesdkreactnative/BinderFactory.java +9 -0
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAdSettingModule.java +148 -49
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAdView.java +46 -27
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAppOpenAd.java +136 -0
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationCustomNativeAdView.java +37 -46
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationExitPopupAd.java +240 -0
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationInterstitialAd.java +189 -0
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationLoggerModule.java +2 -1
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationNativeAdViewListenerBridge.java +83 -0
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationRewardAd.java +255 -6
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationTemplateNativeAdView.java +191 -70
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationTransitionPopupAd.java +218 -0
- package/android/src/main/java/com/adwhalesdkreactnative/RNWrapperView.java +137 -0
- package/android/src/main/java/com/adwhalesdkreactnative/SimpleBinderFactory.java +1 -1
- package/android/src/main/java/com/adwhalesdkreactnative/common/RNMethodArgConst.java +112 -0
- package/android/src/main/java/com/adwhalesdkreactnative/common/RNMethodCallConst.java +113 -0
- package/android/src/main/java/com/adwhalesdkreactnative/common/RNMethodResultConst.java +28 -0
- package/build/generated/ios/ReactAppDependencyProvider.podspec +34 -0
- package/ios/AdWhaleNativeCustomViewFactoryRegistry.swift +56 -0
- package/ios/AdwhaleSdkReactNative.mm +96 -5
- package/ios/AdwhaleSdkReactNativeModule.swift +148 -0
- package/ios/RNAdWhaleMediationAdViewManager.m +38 -0
- package/ios/RNAdWhaleMediationAdViewManager.swift +14 -0
- package/ios/RNAdWhaleMediationAppOpenAd.m +18 -0
- package/ios/RNAdWhaleMediationAppOpenAd.swift +175 -0
- package/ios/RNAdWhaleMediationCustomNativeAdViewManager.m +22 -0
- package/ios/RNAdWhaleMediationCustomNativeAdViewManager.swift +239 -0
- package/ios/RNAdWhaleMediationInterstitialAd.m +18 -0
- package/ios/RNAdWhaleMediationInterstitialAd.swift +161 -0
- package/ios/RNAdWhaleMediationRewardAd.m +18 -0
- package/ios/RNAdWhaleMediationRewardAd.swift +172 -0
- package/ios/WhaleMediationBannerContainer.swift +182 -0
- package/lib/module/AdWhaleAdView.js +58 -3
- package/lib/module/AdWhaleAdView.js.map +1 -1
- package/lib/module/AdWhaleAppOpenAd.js +223 -25
- package/lib/module/AdWhaleAppOpenAd.js.map +1 -1
- package/lib/module/AdWhaleExitPopupAd.js +93 -0
- package/lib/module/AdWhaleExitPopupAd.js.map +1 -0
- package/lib/module/AdWhaleInterstitialAd.js +146 -22
- package/lib/module/AdWhaleInterstitialAd.js.map +1 -1
- package/lib/module/AdWhaleMediationAds.js +75 -4
- package/lib/module/AdWhaleMediationAds.js.map +1 -1
- package/lib/module/AdWhaleNativeCustomView.js +59 -8
- package/lib/module/AdWhaleNativeCustomView.js.map +1 -1
- package/lib/module/AdWhaleNativeTemplateView.js +37 -19
- package/lib/module/AdWhaleNativeTemplateView.js.map +1 -1
- package/lib/module/AdWhaleRewardAd.js +169 -24
- package/lib/module/AdWhaleRewardAd.js.map +1 -1
- package/lib/module/AdWhaleTransitionPopupAd.js +87 -0
- package/lib/module/AdWhaleTransitionPopupAd.js.map +1 -0
- package/lib/module/NativeAdwhaleSdkReactNative.js +16 -1
- package/lib/module/NativeAdwhaleSdkReactNative.js.map +1 -1
- package/lib/module/constants/AdWhaleMethodArgConst.js +53 -0
- package/lib/module/constants/AdWhaleMethodArgConst.js.map +1 -0
- package/lib/module/constants/AdWhaleMethodCallConst.js +56 -0
- package/lib/module/constants/AdWhaleMethodCallConst.js.map +1 -0
- package/lib/module/constants/AdWhaleMethodResultConst.js +16 -0
- package/lib/module/constants/AdWhaleMethodResultConst.js.map +1 -0
- package/lib/module/index.js +10 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/AdWhaleAdView.d.ts +20 -2
- package/lib/typescript/src/AdWhaleAdView.d.ts.map +1 -1
- package/lib/typescript/src/AdWhaleAppOpenAd.d.ts +10 -0
- package/lib/typescript/src/AdWhaleAppOpenAd.d.ts.map +1 -1
- package/lib/typescript/src/AdWhaleExitPopupAd.d.ts +36 -0
- package/lib/typescript/src/AdWhaleExitPopupAd.d.ts.map +1 -0
- package/lib/typescript/src/AdWhaleInterstitialAd.d.ts +16 -0
- package/lib/typescript/src/AdWhaleInterstitialAd.d.ts.map +1 -1
- package/lib/typescript/src/AdWhaleMediationAds.d.ts +13 -5
- package/lib/typescript/src/AdWhaleMediationAds.d.ts.map +1 -1
- package/lib/typescript/src/AdWhaleNativeCustomView.d.ts +7 -4
- package/lib/typescript/src/AdWhaleNativeCustomView.d.ts.map +1 -1
- package/lib/typescript/src/AdWhaleNativeTemplateView.d.ts +20 -7
- package/lib/typescript/src/AdWhaleNativeTemplateView.d.ts.map +1 -1
- package/lib/typescript/src/AdWhaleRewardAd.d.ts +18 -2
- package/lib/typescript/src/AdWhaleRewardAd.d.ts.map +1 -1
- package/lib/typescript/src/AdWhaleTransitionPopupAd.d.ts +33 -0
- package/lib/typescript/src/AdWhaleTransitionPopupAd.d.ts.map +1 -0
- package/lib/typescript/src/NativeAdwhaleSdkReactNative.d.ts +28 -6
- package/lib/typescript/src/NativeAdwhaleSdkReactNative.d.ts.map +1 -1
- package/lib/typescript/src/constants/AdWhaleMethodArgConst.d.ts +51 -0
- package/lib/typescript/src/constants/AdWhaleMethodArgConst.d.ts.map +1 -0
- package/lib/typescript/src/constants/AdWhaleMethodCallConst.d.ts +53 -0
- package/lib/typescript/src/constants/AdWhaleMethodCallConst.d.ts.map +1 -0
- package/lib/typescript/src/constants/AdWhaleMethodResultConst.d.ts +14 -0
- package/lib/typescript/src/constants/AdWhaleMethodResultConst.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +9 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/AdWhaleAdView.tsx +92 -4
- package/src/AdWhaleAppOpenAd.ts +293 -38
- package/src/AdWhaleExitPopupAd.ts +183 -0
- package/src/AdWhaleInterstitialAd.ts +206 -36
- package/src/AdWhaleMediationAds.ts +108 -4
- package/src/AdWhaleNativeCustomView.tsx +85 -23
- package/src/AdWhaleNativeTemplateView.tsx +79 -42
- package/src/AdWhaleRewardAd.ts +245 -43
- package/src/AdWhaleTransitionPopupAd.ts +171 -0
- package/src/NativeAdwhaleSdkReactNative.ts +30 -6
- package/src/constants/AdWhaleMethodArgConst.ts +50 -0
- package/src/constants/AdWhaleMethodCallConst.ts +60 -0
- package/src/constants/AdWhaleMethodResultConst.ts +13 -0
- package/src/index.ts +33 -0
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
import { TurboModuleRegistry, type TurboModule } from 'react-native';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Flutter `AdWhaleInitResult` / 네이티브 초기화 성공 맵과 동일: `statusCode`, `message` 만.
|
|
5
|
+
* 성공 여부는 `statusCode === 100` (Flutter 와 동일).
|
|
6
|
+
* TurboModule codegen 은 메서드명 `initialize` 를 사용합니다 (Flutter MethodChannel 은 `_init`).
|
|
7
|
+
*/
|
|
3
8
|
export interface InitializeResult {
|
|
4
9
|
statusCode: number;
|
|
5
10
|
message: string;
|
|
6
|
-
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Flutter GDPR `requestGdprConsent` 응답 맵: `success`, `message` */
|
|
14
|
+
export interface GdprConsentResult {
|
|
15
|
+
success: boolean;
|
|
16
|
+
message: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Ad Inspector 닫힘 콜백과 동일한 status/message (Flutter 와 키 정렬) */
|
|
20
|
+
export interface AdInspectorResult {
|
|
21
|
+
statusCode: number;
|
|
22
|
+
message: string;
|
|
7
23
|
}
|
|
8
24
|
|
|
9
25
|
export interface Spec extends TurboModule {
|
|
26
|
+
/** RN codegen Java `initialize(Promise)` — Flutter MethodChannel 은 `_init` */
|
|
10
27
|
initialize(): Promise<InitializeResult>;
|
|
11
28
|
setCoppa(isEnabled: boolean): void;
|
|
12
|
-
requestGdprConsent(): Promise<
|
|
13
|
-
isSuccess: boolean;
|
|
14
|
-
message: string;
|
|
15
|
-
}>;
|
|
29
|
+
requestGdprConsent(): Promise<GdprConsentResult>;
|
|
16
30
|
getConsentStatus(): Promise<{
|
|
17
31
|
coppa: boolean;
|
|
18
32
|
gdpr: string;
|
|
@@ -20,6 +34,16 @@ export interface Spec extends TurboModule {
|
|
|
20
34
|
}>;
|
|
21
35
|
resetGdprConsentStatus(): void;
|
|
22
36
|
setGdpr(consent: boolean): void;
|
|
37
|
+
setTagForUnderAgeOfConsent(tag: boolean): void;
|
|
38
|
+
setMaxAdContentRating(rating: string | null): void;
|
|
39
|
+
setTestDeviceIdentifiers(testDeviceIds: string[] | null): void;
|
|
40
|
+
showAdInspector(): Promise<AdInspectorResult>;
|
|
41
|
+
setAppMuted(isMuted: boolean): void;
|
|
42
|
+
setAppVolume(volume: number): void;
|
|
23
43
|
}
|
|
24
44
|
|
|
25
|
-
|
|
45
|
+
/**
|
|
46
|
+
* iOS/Android 네이티브에 모듈이 없거나 링크되지 않은 경우 null.
|
|
47
|
+
* (getEnforcing 는 로드 시점에 앱 전체가 크래시하므로 get 사용)
|
|
48
|
+
*/
|
|
49
|
+
export default TurboModuleRegistry.get<Spec>('AdwhaleSdkReactNative');
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flutter `lib/src/flutter_method_arg_const.dart` / Android `FlutterMethodArgConst` 와
|
|
3
|
+
* 동일한 키 문자열을 유지합니다. RN 전용 키는 주석으로 표시합니다.
|
|
4
|
+
*/
|
|
5
|
+
export const AdWhaleMethodArgConst = {
|
|
6
|
+
sendStatusCode: 'statusCode',
|
|
7
|
+
sendMessage: 'message',
|
|
8
|
+
/** Flutter GDPR 등 */
|
|
9
|
+
sendSuccess: 'success',
|
|
10
|
+
/** RN 레거시 — init/showAdInspector 는 `sendStatusCode`(100) 로 성공 판별 */
|
|
11
|
+
sendIsSuccess: 'isSuccess',
|
|
12
|
+
sendCode: 'code',
|
|
13
|
+
sendEventName: 'eventName',
|
|
14
|
+
sendErrorMessage: 'errorMessage',
|
|
15
|
+
sendErrorCode: 'errorCode',
|
|
16
|
+
sendRewardAmount: 'RewardAmount',
|
|
17
|
+
sendRewardType: 'RewardType',
|
|
18
|
+
sendHeightPx: 'heightPx',
|
|
19
|
+
sendReason: 'reason',
|
|
20
|
+
receiveAdId: 'adId',
|
|
21
|
+
receivePlacementUid: 'placementUid',
|
|
22
|
+
receiveRating: 'rating',
|
|
23
|
+
receiveHasConsent: 'hasConsent',
|
|
24
|
+
receiveValue: 'value',
|
|
25
|
+
receiveTfuaMode: 'tfuaMode',
|
|
26
|
+
receiveIds: 'ids',
|
|
27
|
+
receiveRequestId: 'requestId',
|
|
28
|
+
receiveIsChildDirected: 'isChildDirected',
|
|
29
|
+
receiveEnabled: 'enabled',
|
|
30
|
+
receiveIsMuted: 'isMuted',
|
|
31
|
+
receivedVolume: 'volume',
|
|
32
|
+
receiveRegion: 'region',
|
|
33
|
+
receiveGcoder: 'gcoder',
|
|
34
|
+
receiveLt: 'lt',
|
|
35
|
+
receiveLng: 'lng',
|
|
36
|
+
receivePlacementName: 'placementName',
|
|
37
|
+
receivePrimaryButtonText: 'primaryButtonText',
|
|
38
|
+
receiveSecondaryButtonText: 'secondaryButtonText',
|
|
39
|
+
receiveCustomDescription: 'customDescription',
|
|
40
|
+
receiveOptions: 'options',
|
|
41
|
+
receiveAdaptiveAnchorWidth: 'adaptiveAnchorWidth',
|
|
42
|
+
receiveAndroidPlacementUid: 'androidPlacementUid',
|
|
43
|
+
receiveBannerHeight: 'bannerHeight',
|
|
44
|
+
receiveNativeAdOptions: 'nativeAdOptions',
|
|
45
|
+
receiveTemplateStyle: 'templateStyle',
|
|
46
|
+
sendCoppa: 'coppa',
|
|
47
|
+
sendGdpr: 'gdpr',
|
|
48
|
+
sendPersonalizedConsent: 'personalizedConsent',
|
|
49
|
+
sendRegistrationName: 'registrationName',
|
|
50
|
+
} as const;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flutter `lib/src/flutter_method_call_const.dart` 와 동일한 메서드·이벤트 이름.
|
|
3
|
+
* RN ViewManager 전용 prop 은 주석으로 구분합니다.
|
|
4
|
+
*/
|
|
5
|
+
export const AdWhaleMethodCallConst = {
|
|
6
|
+
// 글로벌 (TurboModule)
|
|
7
|
+
/** RN TurboModule codegen — Java {@code initialize(Promise)} */
|
|
8
|
+
initialize: 'initialize',
|
|
9
|
+
/** Flutter MethodChannel 전용 (TurboModule 과 다름) */
|
|
10
|
+
flutterInit: '_init',
|
|
11
|
+
requestGdprConsent: 'requestGdprConsent',
|
|
12
|
+
resetGdprConsentStatus: 'resetGdprConsentStatus',
|
|
13
|
+
setGdpr: 'setGdpr',
|
|
14
|
+
getConsentStatus: 'getConsentStatus',
|
|
15
|
+
setTagForUnderAgeOfConsent: 'setTagForUnderAgeOfConsent',
|
|
16
|
+
setMaxAdContentRating: 'setMaxAdContentRating',
|
|
17
|
+
setTestDeviceIdentifiers: 'setTestDeviceIdentifiers',
|
|
18
|
+
showAdInspector: 'showAdInspector',
|
|
19
|
+
setCoppa: 'setCoppa',
|
|
20
|
+
setLoggerEnabled: 'setLoggerEnabled',
|
|
21
|
+
getLogLevel: 'getLogLevel',
|
|
22
|
+
setAppMuted: 'setAppMuted',
|
|
23
|
+
setAppVolume: 'setAppVolume',
|
|
24
|
+
|
|
25
|
+
// Flutter: adId 기반 배너 (RN 에는 추후 TurboModule 로 대응 가능)
|
|
26
|
+
loadBannerAd: 'loadBannerAd',
|
|
27
|
+
resumeBannerAd: 'resumeBannerAd',
|
|
28
|
+
pauseBannerAd: 'pauseBannerAd',
|
|
29
|
+
destroyBannerAd: 'destroyBannerAd',
|
|
30
|
+
|
|
31
|
+
/** RN Android 에는 아직 네이티브 구현 없음 — 상수만 동기화 */
|
|
32
|
+
loadPreloadBannerAd: 'loadPreloadBannerAd',
|
|
33
|
+
showPreloadBannerAd: 'showPreloadBannerAd',
|
|
34
|
+
resumePreloadBannerAd: 'resumePreloadBannerAd',
|
|
35
|
+
pausePreloadBannerAd: 'pausePreloadBannerAd',
|
|
36
|
+
destroyPreloadBannerAd: 'destroyPreloadBannerAd',
|
|
37
|
+
|
|
38
|
+
/** RN 배너 View — Flutter loadBannerAd 와 역할 유사한 prop */
|
|
39
|
+
loadAd: 'loadAd',
|
|
40
|
+
showAd: 'showAd',
|
|
41
|
+
placementUid: 'placementUid',
|
|
42
|
+
adSize: 'adSize',
|
|
43
|
+
factoryId: 'factoryId',
|
|
44
|
+
|
|
45
|
+
onAdInspectorClosed: 'onAdInspectorClosed',
|
|
46
|
+
onInitComplete: 'onInitComplete',
|
|
47
|
+
onAdLoaded: 'onAdLoaded',
|
|
48
|
+
onAdLoadFailed: 'onAdLoadFailed',
|
|
49
|
+
onAdFailedToLoad: 'onAdFailedToLoad',
|
|
50
|
+
onAdClicked: 'onAdClicked',
|
|
51
|
+
|
|
52
|
+
onNativeAdLoaded: 'onNativeAdLoaded',
|
|
53
|
+
onNativeAdFailedToLoad: 'onNativeAdFailedToLoad',
|
|
54
|
+
onNativeAdShowFailed: 'onNativeAdShowFailed',
|
|
55
|
+
onNativeAdClicked: 'onNativeAdClicked',
|
|
56
|
+
onNativeAdClosed: 'onNativeAdClosed',
|
|
57
|
+
onNativeAdViewHeight: 'onNativeAdViewHeight',
|
|
58
|
+
} as const;
|
|
59
|
+
|
|
60
|
+
export type AdWhaleMethodCallConstKey = keyof typeof AdWhaleMethodCallConst;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flutter `FlutterMethodResultConst` 와 동일한 Promise.reject / result.error 코드 문자열.
|
|
3
|
+
*/
|
|
4
|
+
export const AdWhaleMethodResultConst = {
|
|
5
|
+
noActivity: 'NoActivity',
|
|
6
|
+
invalidArgs: 'InvalidArgs',
|
|
7
|
+
nativeAdError: 'NativeAdError',
|
|
8
|
+
preloadBannerError: 'PreloadBannerError',
|
|
9
|
+
bannerAdError: 'BannerAdError',
|
|
10
|
+
adShowError: 'AdShowError',
|
|
11
|
+
openInspectorFailed: 'OpenInspectorFailed',
|
|
12
|
+
getLogLevelError: 'GetLogLevelError',
|
|
13
|
+
} as const;
|
package/src/index.ts
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
// ✅ 1) SDK 초기화 / 설정 (TurboModule 래퍼)
|
|
4
4
|
export { AdWhaleMediationAds } from './AdWhaleMediationAds';
|
|
5
|
+
export type {
|
|
6
|
+
InitializeResult,
|
|
7
|
+
GdprConsentResult,
|
|
8
|
+
AdInspectorResult,
|
|
9
|
+
} from './AdWhaleMediationAds';
|
|
5
10
|
// 사용 예:
|
|
6
11
|
// AdWhaleMediationAds.initialize()
|
|
7
12
|
// AdWhaleMediationAds.setLoggerEnabled(true)
|
|
@@ -11,11 +16,20 @@ export { AdWhaleMediationAds } from './AdWhaleMediationAds';
|
|
|
11
16
|
// AdWhaleMediationAds.resetGdprConsentStatus()
|
|
12
17
|
// AdWhaleMediationAds.setGdpr(true)
|
|
13
18
|
|
|
19
|
+
// Flutter 브릿지 상수와 동일 문자열 유지 (유지보수 시 Flutter 저장소와 대조)
|
|
20
|
+
export {
|
|
21
|
+
AdWhaleMethodCallConst,
|
|
22
|
+
type AdWhaleMethodCallConstKey,
|
|
23
|
+
} from './constants/AdWhaleMethodCallConst';
|
|
24
|
+
export { AdWhaleMethodArgConst } from './constants/AdWhaleMethodArgConst';
|
|
25
|
+
export { AdWhaleMethodResultConst } from './constants/AdWhaleMethodResultConst';
|
|
14
26
|
|
|
15
27
|
// ✅ 2) 배너 광고 View 컴포넌트
|
|
16
28
|
export {
|
|
17
29
|
AdWhaleAdView,
|
|
18
30
|
AdWhaleAdSize,
|
|
31
|
+
ADWHALE_BANNER_IOS_UNSUPPORTED_STATUS_CODE,
|
|
32
|
+
isAdWhaleBannerAdSizeSupportedOnIos,
|
|
19
33
|
} from './AdWhaleAdView';
|
|
20
34
|
export type {
|
|
21
35
|
AdWhaleBannerError,
|
|
@@ -54,6 +68,25 @@ export type {
|
|
|
54
68
|
} from './AdWhaleAppOpenAd';
|
|
55
69
|
|
|
56
70
|
|
|
71
|
+
// ✅ 5.1) 종료 팝업 광고 API (Android)
|
|
72
|
+
export { AdWhaleExitPopupAd } from './AdWhaleExitPopupAd';
|
|
73
|
+
export type {
|
|
74
|
+
AdWhaleExitPopupAdClosedEvent,
|
|
75
|
+
AdWhaleExitPopupAdErrorEvent,
|
|
76
|
+
AdWhaleExitPopupAdEvents,
|
|
77
|
+
AdWhaleExitPopupGcoder,
|
|
78
|
+
} from './AdWhaleExitPopupAd';
|
|
79
|
+
|
|
80
|
+
// ✅ 5.2) 앱 전환 팝업 광고 API (Android)
|
|
81
|
+
export { AdWhaleTransitionPopupAd } from './AdWhaleTransitionPopupAd';
|
|
82
|
+
export type {
|
|
83
|
+
AdWhaleTransitionPopupAdClosedEvent,
|
|
84
|
+
AdWhaleTransitionPopupAdErrorEvent,
|
|
85
|
+
AdWhaleTransitionPopupAdEvents,
|
|
86
|
+
AdWhaleTransitionPopupGcoder,
|
|
87
|
+
} from './AdWhaleTransitionPopupAd';
|
|
88
|
+
|
|
89
|
+
|
|
57
90
|
// ✅ 6) 네이티브 커스텀 뷰 (네이티브 템플릿/커스텀용)
|
|
58
91
|
export {
|
|
59
92
|
AdWhaleNativeCustomView,
|