adwhale-sdk-react-native 2.7.100 → 2.7.101
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 +3 -3
- package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAdSettingModule.java +61 -0
- package/lib/module/AdWhaleMediationSdk.js +39 -9
- package/lib/module/AdWhaleMediationSdk.js.map +1 -1
- package/lib/module/NativeAdwhaleSdkReactNative.js.map +1 -1
- package/lib/typescript/src/AdWhaleMediationSdk.d.ts.map +1 -1
- package/lib/typescript/src/NativeAdwhaleSdkReactNative.d.ts +12 -0
- package/lib/typescript/src/NativeAdwhaleSdkReactNative.d.ts.map +1 -1
- package/package.json +1 -1
- package/react-native.config.js +4 -14
- package/src/AdWhaleMediationSdk.ts +40 -34
- package/src/NativeAdwhaleSdkReactNative.ts +12 -0
package/README.md
CHANGED
|
@@ -43,7 +43,7 @@ npm install adwhale-sdk-react-native
|
|
|
43
43
|
운영 안정성을 중시하는 경우
|
|
44
44
|
```json
|
|
45
45
|
{
|
|
46
|
-
"adwhale-sdk-react-native": "~2.7.
|
|
46
|
+
"adwhale-sdk-react-native": "~2.7.101"
|
|
47
47
|
}
|
|
48
48
|
```
|
|
49
49
|
- Android SDK 2.7.1 기반 유지
|
|
@@ -52,7 +52,7 @@ npm install adwhale-sdk-react-native
|
|
|
52
52
|
### 동일한 Android SDK 기반의 최신 RN 수정만 사용
|
|
53
53
|
```json
|
|
54
54
|
{
|
|
55
|
-
"adwhale-sdk-react-native": "^2.7.
|
|
55
|
+
"adwhale-sdk-react-native": "^2.7.101"
|
|
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.
|
|
65
|
+
"adwhale-sdk-react-native": "2.7.101"
|
|
66
66
|
}
|
|
67
67
|
```
|
|
68
68
|
|
package/android/src/main/java/com/adwhalesdkreactnative/RNAdWhaleMediationAdSettingModule.java
CHANGED
|
@@ -5,13 +5,16 @@ import android.util.Log;
|
|
|
5
5
|
|
|
6
6
|
import androidx.annotation.Nullable;
|
|
7
7
|
|
|
8
|
+
import com.facebook.react.bridge.Arguments;
|
|
8
9
|
import com.facebook.react.bridge.Promise;
|
|
9
10
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
10
11
|
import com.facebook.react.bridge.ReactMethod;
|
|
12
|
+
import com.facebook.react.bridge.WritableMap;
|
|
11
13
|
import com.facebook.react.module.annotations.ReactModule;
|
|
12
14
|
|
|
13
15
|
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAds;
|
|
14
16
|
import net.adwhale.sdk.mediation.ads.AdWhaleMediationOnInitCompleteListener;
|
|
17
|
+
import net.adwhale.sdk.mediation.ads.GdprConsentStatus;
|
|
15
18
|
import net.adwhale.sdk.utils.AdWhaleLog;
|
|
16
19
|
|
|
17
20
|
import java.util.HashMap;
|
|
@@ -34,6 +37,64 @@ public class RNAdWhaleMediationAdSettingModule extends NativeAdwhaleSdkReactNati
|
|
|
34
37
|
return REACT_CLASS_NAME;
|
|
35
38
|
}
|
|
36
39
|
|
|
40
|
+
@ReactMethod
|
|
41
|
+
public void setCoppa(boolean isEnabled) {
|
|
42
|
+
AdWhaleMediationAds.setCoppa(isEnabled);
|
|
43
|
+
Log.d(REACT_CLASS_NAME, "COPPA setting applied: " + isEnabled);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@ReactMethod
|
|
47
|
+
public void requestGdprConsent(final Promise promise) {
|
|
48
|
+
Activity currentActivity = getCurrentActivity();
|
|
49
|
+
if (currentActivity == null) {
|
|
50
|
+
promise.reject("NO_ACTIVITY", "Current activity is null.");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
currentActivity.runOnUiThread(() ->
|
|
54
|
+
AdWhaleMediationAds.requestGdprConsent(currentActivity, (isSuccess, message) -> {
|
|
55
|
+
WritableMap result = Arguments.createMap();
|
|
56
|
+
result.putBoolean("isSuccess", isSuccess);
|
|
57
|
+
result.putString("message", message);
|
|
58
|
+
promise.resolve(result);
|
|
59
|
+
})
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@ReactMethod
|
|
64
|
+
public void getConsentStatus(Promise promise) {
|
|
65
|
+
Activity currentActivity = getCurrentActivity();
|
|
66
|
+
if (currentActivity == null) {
|
|
67
|
+
promise.reject("NO_ACTIVITY", "Current activity is null.");
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
boolean coppa = AdWhaleMediationAds.isCoppaApplied();
|
|
72
|
+
GdprConsentStatus gdpr = AdWhaleMediationAds.getGdprConsentStatus(currentActivity);
|
|
73
|
+
boolean personalizedConsent = AdWhaleMediationAds.getAdwhaleGDPR(currentActivity);
|
|
74
|
+
|
|
75
|
+
WritableMap statusMap = Arguments.createMap();
|
|
76
|
+
statusMap.putBoolean("coppa", coppa);
|
|
77
|
+
statusMap.putString("gdpr", gdpr.name());
|
|
78
|
+
statusMap.putBoolean("personalizedConsent", personalizedConsent);
|
|
79
|
+
|
|
80
|
+
promise.resolve(statusMap);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@ReactMethod
|
|
84
|
+
public void resetGdprConsentStatus() {
|
|
85
|
+
Activity currentActivity = getCurrentActivity();
|
|
86
|
+
if (currentActivity != null) {
|
|
87
|
+
currentActivity.runOnUiThread(() -> AdWhaleMediationAds.resetGdprConsentStatus(currentActivity));
|
|
88
|
+
Log.d(REACT_CLASS_NAME, "GDPR consent status has been reset.");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@ReactMethod
|
|
93
|
+
public void setGdpr(boolean consent) {
|
|
94
|
+
AdWhaleMediationAds.setGdpr(consent);
|
|
95
|
+
Log.d(REACT_CLASS_NAME, "Personalized Consent set to: " + consent);
|
|
96
|
+
}
|
|
97
|
+
|
|
37
98
|
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
38
99
|
public void initialize(final Promise promise) {
|
|
39
100
|
Log.i(REACT_CLASS_NAME, ".initialize()");
|
|
@@ -2,16 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
// src/AdWhaleMediationSdk.ts
|
|
4
4
|
import { NativeModules, Platform } from 'react-native';
|
|
5
|
+
import NativeAdwhaleSdkReactNative from "./NativeAdwhaleSdkReactNative.js";
|
|
5
6
|
const LINKING_ERROR = `AdWhale Mediation SDK native modules not linked.\n` + `Make sure:\n` + ` • Android: AdwhaleSdkReactNative / RNAdWhaleMediationLoggerModule 등록 여부\n` + ` • iOS: Pod install 및 빌드 완료 여부\n` + ` • Web 환경에서 실행 중이 아닌지\n` + `Platform: ${Platform.OS}`;
|
|
6
|
-
|
|
7
|
-
// 네이티브 이름에 맞게 수정 👇
|
|
8
|
-
|
|
9
7
|
const {
|
|
10
|
-
AdwhaleSdkReactNative,
|
|
11
8
|
RNAdWhaleMediationLoggerModule
|
|
12
9
|
} = NativeModules;
|
|
10
|
+
|
|
11
|
+
// TurboModule spec을 통해 접근
|
|
12
|
+
const AdwhaleSdkReactNative = NativeAdwhaleSdkReactNative;
|
|
13
13
|
if (!AdwhaleSdkReactNative) {
|
|
14
14
|
console.warn(LINKING_ERROR);
|
|
15
|
+
} else {
|
|
16
|
+
console.log('[AdWhaleMediationSdk] Native module linked:', {
|
|
17
|
+
hasInitialize: !!AdwhaleSdkReactNative.initialize,
|
|
18
|
+
hasRequestGdprConsent: !!AdwhaleSdkReactNative.requestGdprConsent,
|
|
19
|
+
hasGetConsentStatus: !!AdwhaleSdkReactNative.getConsentStatus,
|
|
20
|
+
hasResetGdprConsentStatus: !!AdwhaleSdkReactNative.resetGdprConsentStatus,
|
|
21
|
+
hasSetGdpr: !!AdwhaleSdkReactNative.setGdpr,
|
|
22
|
+
hasSetCoppa: !!AdwhaleSdkReactNative.setCoppa
|
|
23
|
+
});
|
|
15
24
|
}
|
|
16
25
|
export const AdWhaleMediationSdk = {
|
|
17
26
|
initialize() {
|
|
@@ -24,25 +33,46 @@ export const AdWhaleMediationSdk = {
|
|
|
24
33
|
RNAdWhaleMediationLoggerModule?.setLogLevel?.(enabled);
|
|
25
34
|
},
|
|
26
35
|
setCoppa(enabled) {
|
|
27
|
-
|
|
36
|
+
console.log('[AdWhaleMediationSdk] setCoppa called:', enabled);
|
|
37
|
+
if (!AdwhaleSdkReactNative?.setCoppa) {
|
|
38
|
+
console.warn('[AdWhaleMediationSdk] setCoppa is not implemented in native module');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
AdwhaleSdkReactNative.setCoppa(enabled);
|
|
28
42
|
},
|
|
29
43
|
requestGdprConsent() {
|
|
44
|
+
console.log('[AdWhaleMediationSdk] requestGdprConsent called');
|
|
30
45
|
if (!AdwhaleSdkReactNative?.requestGdprConsent) {
|
|
31
|
-
|
|
46
|
+
const error = new Error('requestGdprConsent is not implemented in native module');
|
|
47
|
+
console.error('[AdWhaleMediationSdk]', error);
|
|
48
|
+
return Promise.reject(error);
|
|
32
49
|
}
|
|
33
50
|
return AdwhaleSdkReactNative.requestGdprConsent();
|
|
34
51
|
},
|
|
35
52
|
getConsentStatus() {
|
|
53
|
+
console.log('[AdWhaleMediationSdk] getConsentStatus called');
|
|
36
54
|
if (!AdwhaleSdkReactNative?.getConsentStatus) {
|
|
37
|
-
|
|
55
|
+
const error = new Error('getConsentStatus is not implemented in native module');
|
|
56
|
+
console.error('[AdWhaleMediationSdk]', error);
|
|
57
|
+
return Promise.reject(error);
|
|
38
58
|
}
|
|
39
59
|
return AdwhaleSdkReactNative.getConsentStatus();
|
|
40
60
|
},
|
|
41
61
|
resetGdprConsentStatus() {
|
|
42
|
-
|
|
62
|
+
console.log('[AdWhaleMediationSdk] resetGdprConsentStatus called');
|
|
63
|
+
if (!AdwhaleSdkReactNative?.resetGdprConsentStatus) {
|
|
64
|
+
console.warn('[AdWhaleMediationSdk] resetGdprConsentStatus is not implemented in native module');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
AdwhaleSdkReactNative.resetGdprConsentStatus();
|
|
43
68
|
},
|
|
44
69
|
setGdpr(consent) {
|
|
45
|
-
|
|
70
|
+
console.log('[AdWhaleMediationSdk] setGdpr called:', consent);
|
|
71
|
+
if (!AdwhaleSdkReactNative?.setGdpr) {
|
|
72
|
+
console.warn('[AdWhaleMediationSdk] setGdpr is not implemented in native module');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
AdwhaleSdkReactNative.setGdpr(consent);
|
|
46
76
|
}
|
|
47
77
|
};
|
|
48
78
|
//# sourceMappingURL=AdWhaleMediationSdk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","Platform","LINKING_ERROR","OS","
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeAdwhaleSdkReactNative.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeAdwhaleSdkReactNative.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAkBpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,uBAAuB,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdWhaleMediationSdk.d.ts","sourceRoot":"","sources":["../../../src/AdWhaleMediationSdk.ts"],"names":[],"mappings":"
|
|
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,6 +1,18 @@
|
|
|
1
1
|
import { type TurboModule } from 'react-native';
|
|
2
2
|
export interface Spec extends TurboModule {
|
|
3
3
|
initialize(): Promise<number>;
|
|
4
|
+
setCoppa(isEnabled: boolean): void;
|
|
5
|
+
requestGdprConsent(): Promise<{
|
|
6
|
+
isSuccess: boolean;
|
|
7
|
+
message: string;
|
|
8
|
+
}>;
|
|
9
|
+
getConsentStatus(): Promise<{
|
|
10
|
+
coppa: boolean;
|
|
11
|
+
gdpr: string;
|
|
12
|
+
personalizedConsent: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
resetGdprConsentStatus(): void;
|
|
15
|
+
setGdpr(consent: boolean): void;
|
|
4
16
|
}
|
|
5
17
|
declare const _default: Spec;
|
|
6
18
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeAdwhaleSdkReactNative.d.ts","sourceRoot":"","sources":["../../../src/NativeAdwhaleSdkReactNative.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeAdwhaleSdkReactNative.d.ts","sourceRoot":"","sources":["../../../src/NativeAdwhaleSdkReactNative.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,kBAAkB,IAAI,OAAO,CAAC;QAC5B,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,gBAAgB,IAAI,OAAO,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC,CAAC;IACH,sBAAsB,IAAI,IAAI,CAAC;IAC/B,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACjC;;AAED,wBAA+E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adwhale-sdk-react-native",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.101",
|
|
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",
|
package/react-native.config.js
CHANGED
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
|
|
3
3
|
module.exports = {
|
|
4
|
-
dependencies
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
android: {
|
|
9
|
-
sourceDir: path.join(__dirname, 'android'),
|
|
10
|
-
},
|
|
11
|
-
ios: {
|
|
12
|
-
// iOS는 나중에 구현할 예정이라면 비워둬도 됨
|
|
13
|
-
// podspec이 있으므로 autolinking은 자동됨
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
},
|
|
4
|
+
// dependencies 섹션은 제거 - 라이브러리 프로젝트 자체에서는 불필요하며
|
|
5
|
+
// autolinking 충돌을 일으킬 수 있음
|
|
6
|
+
// 다른 프로젝트에서 이 라이브러리를 사용할 때는 package.json의 설정을 기반으로
|
|
7
|
+
// 자동으로 autolinking이 동작함
|
|
18
8
|
|
|
19
9
|
// TurboModule codegen 위치 지정
|
|
20
10
|
project: {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/AdWhaleMediationSdk.ts
|
|
2
2
|
import { NativeModules, Platform } from 'react-native';
|
|
3
|
+
import NativeAdwhaleSdkReactNative from './NativeAdwhaleSdkReactNative';
|
|
3
4
|
|
|
4
5
|
const LINKING_ERROR =
|
|
5
6
|
`AdWhale Mediation SDK native modules not linked.\n` +
|
|
@@ -9,40 +10,28 @@ const LINKING_ERROR =
|
|
|
9
10
|
` • Web 환경에서 실행 중이 아닌지\n` +
|
|
10
11
|
`Platform: ${Platform.OS}`;
|
|
11
12
|
|
|
12
|
-
// 네이티브 이름에 맞게 수정 👇
|
|
13
|
-
interface AdwhaleSdkReactNativeModule {
|
|
14
|
-
initialize(): Promise<number>;
|
|
15
|
-
|
|
16
|
-
// 아래 메서드들은 네이티브에 없으면 자동으로 undefined라서
|
|
17
|
-
// JS에서 optional로 안전하게 처리됨
|
|
18
|
-
setCoppa?(enabled: boolean): void;
|
|
19
|
-
requestGdprConsent?(): Promise<{
|
|
20
|
-
isSuccess: boolean;
|
|
21
|
-
message: string;
|
|
22
|
-
}>;
|
|
23
|
-
getConsentStatus?(): Promise<{
|
|
24
|
-
coppa: boolean;
|
|
25
|
-
gdpr: string;
|
|
26
|
-
personalizedConsent: boolean;
|
|
27
|
-
}>;
|
|
28
|
-
resetGdprConsentStatus?(): void;
|
|
29
|
-
setGdpr?(consent: boolean): void;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
13
|
interface RNAdWhaleMediationLoggerModule {
|
|
33
14
|
setLogLevel?(enabled: boolean): void;
|
|
34
15
|
}
|
|
35
16
|
|
|
36
|
-
const {
|
|
37
|
-
AdwhaleSdkReactNative,
|
|
38
|
-
RNAdWhaleMediationLoggerModule,
|
|
39
|
-
} = NativeModules as {
|
|
40
|
-
AdwhaleSdkReactNative?: AdwhaleSdkReactNativeModule;
|
|
17
|
+
const { RNAdWhaleMediationLoggerModule } = NativeModules as {
|
|
41
18
|
RNAdWhaleMediationLoggerModule?: RNAdWhaleMediationLoggerModule;
|
|
42
19
|
};
|
|
43
20
|
|
|
21
|
+
// TurboModule spec을 통해 접근
|
|
22
|
+
const AdwhaleSdkReactNative = NativeAdwhaleSdkReactNative;
|
|
23
|
+
|
|
44
24
|
if (!AdwhaleSdkReactNative) {
|
|
45
25
|
console.warn(LINKING_ERROR);
|
|
26
|
+
} else {
|
|
27
|
+
console.log('[AdWhaleMediationSdk] Native module linked:', {
|
|
28
|
+
hasInitialize: !!AdwhaleSdkReactNative.initialize,
|
|
29
|
+
hasRequestGdprConsent: !!AdwhaleSdkReactNative.requestGdprConsent,
|
|
30
|
+
hasGetConsentStatus: !!AdwhaleSdkReactNative.getConsentStatus,
|
|
31
|
+
hasResetGdprConsentStatus: !!AdwhaleSdkReactNative.resetGdprConsentStatus,
|
|
32
|
+
hasSetGdpr: !!AdwhaleSdkReactNative.setGdpr,
|
|
33
|
+
hasSetCoppa: !!AdwhaleSdkReactNative.setCoppa,
|
|
34
|
+
});
|
|
46
35
|
}
|
|
47
36
|
|
|
48
37
|
export const AdWhaleMediationSdk = {
|
|
@@ -58,14 +47,20 @@ export const AdWhaleMediationSdk = {
|
|
|
58
47
|
},
|
|
59
48
|
|
|
60
49
|
setCoppa(enabled: boolean) {
|
|
61
|
-
|
|
50
|
+
console.log('[AdWhaleMediationSdk] setCoppa called:', enabled);
|
|
51
|
+
if (!AdwhaleSdkReactNative?.setCoppa) {
|
|
52
|
+
console.warn('[AdWhaleMediationSdk] setCoppa is not implemented in native module');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
AdwhaleSdkReactNative.setCoppa(enabled);
|
|
62
56
|
},
|
|
63
57
|
|
|
64
58
|
requestGdprConsent(): Promise<{ isSuccess: boolean; message: string }> {
|
|
59
|
+
console.log('[AdWhaleMediationSdk] requestGdprConsent called');
|
|
65
60
|
if (!AdwhaleSdkReactNative?.requestGdprConsent) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
);
|
|
61
|
+
const error = new Error('requestGdprConsent is not implemented in native module');
|
|
62
|
+
console.error('[AdWhaleMediationSdk]', error);
|
|
63
|
+
return Promise.reject(error);
|
|
69
64
|
}
|
|
70
65
|
return AdwhaleSdkReactNative.requestGdprConsent();
|
|
71
66
|
},
|
|
@@ -75,19 +70,30 @@ export const AdWhaleMediationSdk = {
|
|
|
75
70
|
gdpr: string;
|
|
76
71
|
personalizedConsent: boolean;
|
|
77
72
|
}> {
|
|
73
|
+
console.log('[AdWhaleMediationSdk] getConsentStatus called');
|
|
78
74
|
if (!AdwhaleSdkReactNative?.getConsentStatus) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
);
|
|
75
|
+
const error = new Error('getConsentStatus is not implemented in native module');
|
|
76
|
+
console.error('[AdWhaleMediationSdk]', error);
|
|
77
|
+
return Promise.reject(error);
|
|
82
78
|
}
|
|
83
79
|
return AdwhaleSdkReactNative.getConsentStatus();
|
|
84
80
|
},
|
|
85
81
|
|
|
86
82
|
resetGdprConsentStatus() {
|
|
87
|
-
|
|
83
|
+
console.log('[AdWhaleMediationSdk] resetGdprConsentStatus called');
|
|
84
|
+
if (!AdwhaleSdkReactNative?.resetGdprConsentStatus) {
|
|
85
|
+
console.warn('[AdWhaleMediationSdk] resetGdprConsentStatus is not implemented in native module');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
AdwhaleSdkReactNative.resetGdprConsentStatus();
|
|
88
89
|
},
|
|
89
90
|
|
|
90
91
|
setGdpr(consent: boolean) {
|
|
91
|
-
|
|
92
|
+
console.log('[AdWhaleMediationSdk] setGdpr called:', consent);
|
|
93
|
+
if (!AdwhaleSdkReactNative?.setGdpr) {
|
|
94
|
+
console.warn('[AdWhaleMediationSdk] setGdpr is not implemented in native module');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
AdwhaleSdkReactNative.setGdpr(consent);
|
|
92
98
|
},
|
|
93
99
|
};
|
|
@@ -2,6 +2,18 @@ import { TurboModuleRegistry, type TurboModule } from 'react-native';
|
|
|
2
2
|
|
|
3
3
|
export interface Spec extends TurboModule {
|
|
4
4
|
initialize(): Promise<number>;
|
|
5
|
+
setCoppa(isEnabled: boolean): void;
|
|
6
|
+
requestGdprConsent(): Promise<{
|
|
7
|
+
isSuccess: boolean;
|
|
8
|
+
message: string;
|
|
9
|
+
}>;
|
|
10
|
+
getConsentStatus(): Promise<{
|
|
11
|
+
coppa: boolean;
|
|
12
|
+
gdpr: string;
|
|
13
|
+
personalizedConsent: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
resetGdprConsentStatus(): void;
|
|
16
|
+
setGdpr(consent: boolean): void;
|
|
5
17
|
}
|
|
6
18
|
|
|
7
19
|
export default TurboModuleRegistry.getEnforcing<Spec>('AdwhaleSdkReactNative');
|