Skip to content

Commit 8f1192d

Browse files
committed
Improve and document onetrust patch
1 parent f10220d commit 8f1192d

4 files changed

Lines changed: 106 additions & 23 deletions

File tree

examples/onetrust/patches/react-native-onetrust-cmp+202601.1.0.patch

Lines changed: 71 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,15 @@ diff --git a/node_modules/react-native-onetrust-cmp/android/src/main/java/com/on
22
index 199531c..c3cfd17 100644
33
--- a/node_modules/react-native-onetrust-cmp/android/src/main/java/com/onetrust/OneTrust.java
44
+++ b/node_modules/react-native-onetrust-cmp/android/src/main/java/com/onetrust/OneTrust.java
5-
@@ -313,6 +313,34 @@ public class OneTrust extends ReactContextBaseJavaModule {
5+
@@ -313,6 +313,39 @@ public class OneTrust extends ReactContextBaseJavaModule {
66
promise.resolve(googleConsentData.toString());
77
}
88

9+
+ @ReactMethod
10+
+ public void fetchPreferencesCmpApiData(Promise promise){
11+
+ promise.resolve(null);
12+
+ }
13+
+
914
+ @ReactMethod
1015
+ public void getPreferenceCenterData(Promise promise){
1116
+ try {
@@ -38,13 +43,18 @@ index 199531c..c3cfd17 100644
3843
public void showConsentPurposesUI(){
3944
final Activity currentActivity = getCurrentActivity();
4045
diff --git a/node_modules/react-native-onetrust-cmp/iOS/OneTrust.m b/node_modules/react-native-onetrust-cmp/iOS/OneTrust.m
41-
index 2c1a676..630a711 100644
46+
index 2c1a676..c20f76a 100644
4247
--- a/node_modules/react-native-onetrust-cmp/iOS/OneTrust.m
4348
+++ b/node_modules/react-native-onetrust-cmp/iOS/OneTrust.m
44-
@@ -36,6 +36,16 @@ + (BOOL)requiresMainQueueSetup{
49+
@@ -36,6 +36,21 @@ + (BOOL)requiresMainQueueSetup{
4550
rejecter:(RCTPromiseRejectBlock)reject
4651
)
4752

53+
+RCT_EXTERN_METHOD(fetchPreferencesCmpApiData:
54+
+ (RCTPromiseResolveBlock)resolve
55+
+ rejecter:(RCTPromiseRejectBlock)reject
56+
+ )
57+
+
4858
+RCT_EXTERN_METHOD(getPreferenceCenterData:
4959
+ (RCTPromiseResolveBlock)resolve
5060
+ rejecter:(RCTPromiseRejectBlock)reject
@@ -59,50 +69,88 @@ index 2c1a676..630a711 100644
5969
(RCTPromiseResolveBlock)resolve
6070
rejecter:(RCTPromiseRejectBlock)reject
6171
diff --git a/node_modules/react-native-onetrust-cmp/iOS/OneTrust.swift b/node_modules/react-native-onetrust-cmp/iOS/OneTrust.swift
62-
index 0030d64..dd789e7 100644
72+
index 0030d64..c9c97f0 100644
6373
--- a/node_modules/react-native-onetrust-cmp/iOS/OneTrust.swift
6474
+++ b/node_modules/react-native-onetrust-cmp/iOS/OneTrust.swift
65-
@@ -108,6 +108,32 @@ import AppTrackingTransparency
75+
@@ -108,6 +108,62 @@ import AppTrackingTransparency
6676

6777
}
6878

79+
+ private func serializeToJSON(_ data: [String: Any]) -> String? {
80+
+ guard JSONSerialization.isValidJSONObject(data),
81+
+ let jsonData = try? JSONSerialization.data(withJSONObject: data),
82+
+ let jsonString = String(data: jsonData, encoding: .utf8) else {
83+
+ return nil
84+
+ }
85+
+ return jsonString
86+
+ }
87+
+
88+
+ @objc(fetchPreferencesCmpApiData:rejecter:)
89+
+ public func fetchPreferencesCmpApiData(_ resolve:@escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock){
90+
+ OTPublishersHeadlessSDK.shared.fetchPreferencesCmpApiData { _ in
91+
+ resolve(nil)
92+
+ }
93+
+ }
94+
+
6995
+ @objc(getPreferenceCenterData:rejecter:)
7096
+ public func getPreferenceCenterData(_ resolve:@escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock){
71-
+ let data = OTPublishersHeadlessSDK.shared.getPreferenceCenterData()
72-
+ if let jsonData = try? JSONSerialization.data(withJSONObject: data),
73-
+ let jsonString = String(data: jsonData, encoding: .utf8) {
74-
+ resolve(jsonString)
75-
+ } else if let jsonString = data as? String {
76-
+ resolve(jsonString)
77-
+ } else {
78-
+ reject("Error parsing preference center data","OneTrust getPreferenceCenterData returned unsupported type.",nil)
97+
+ if let data = OTPublishersHeadlessSDK.shared.getPreferenceCenterData() {
98+
+ if let json = serializeToJSON(data) {
99+
+ resolve(json)
100+
+ } else {
101+
+ reject("OT_GET_PREFERENCE_CENTER_DATA","OneTrust getPreferenceCenterData returned unsupported type.",nil)
102+
+ }
103+
+ return
104+
+ }
105+
+ OTPublishersHeadlessSDK.shared.fetchPreferencesCmpApiData { [weak self] _ in
106+
+ guard let data = OTPublishersHeadlessSDK.shared.getPreferenceCenterData(),
107+
+ let json = self?.serializeToJSON(data) else {
108+
+ resolve(nil)
109+
+ return
110+
+ }
111+
+ resolve(json)
79112
+ }
80113
+ }
81114
+
82115
+ @objc(getBannerData:rejecter:)
83116
+ public func getBannerData(_ resolve:@escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock){
84-
+ let data = OTPublishersHeadlessSDK.shared.getBannerData()
85-
+ if let jsonData = try? JSONSerialization.data(withJSONObject: data),
86-
+ let jsonString = String(data: jsonData, encoding: .utf8) {
87-
+ resolve(jsonString)
88-
+ } else if let jsonString = data as? String {
89-
+ resolve(jsonString)
90-
+ } else {
91-
+ reject("Error parsing banner data","OneTrust getBannerData returned unsupported type.",nil)
117+
+ if let data = OTPublishersHeadlessSDK.shared.getBannerData() {
118+
+ if let json = serializeToJSON(data) {
119+
+ resolve(json)
120+
+ } else {
121+
+ reject("OT_GET_BANNER_DATA","OneTrust getBannerData returned unsupported type.",nil)
122+
+ }
123+
+ return
124+
+ }
125+
+ OTPublishersHeadlessSDK.shared.fetchBannerCmpApiData { [weak self] _ in
126+
+ guard let data = OTPublishersHeadlessSDK.shared.getBannerData(),
127+
+ let json = self?.serializeToJSON(data) else {
128+
+ resolve(nil)
129+
+ return
130+
+ }
131+
+ resolve(json)
92132
+ }
93133
+ }
94134
+
95135
@objc(shouldShowBanner:rejecter:)
96136
public func shouldShowBanner(_ resolve:@escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) -> Void{
97137
let shouldShowBanner = OTPublishersHeadlessSDK.shared.shouldShowBanner()
98138
diff --git a/node_modules/react-native-onetrust-cmp/index.ts b/node_modules/react-native-onetrust-cmp/index.ts
99-
index f99e8c5..2facf15 100644
139+
index f99e8c5..33c48c8 100644
100140
--- a/node_modules/react-native-onetrust-cmp/index.ts
101141
+++ b/node_modules/react-native-onetrust-cmp/index.ts
102-
@@ -149,6 +149,28 @@ export default class OTPublishersNativeSDK{
142+
@@ -149,6 +149,36 @@ export default class OTPublishersNativeSDK{
103143
return JSON.parse(googleConsentModeData);
104144
}
105145

146+
+ /**
147+
+ * Fetches preference center data from the OneTrust CMP API.
148+
+ * Must be called before getPreferenceCenterData on SDK versions 202504.1.0+.
149+
+ */
150+
+ static async fetchPreferencesCmpApiData():Promise<void>{
151+
+ await OneTrust.fetchPreferencesCmpApiData()
152+
+ }
153+
+
106154
+ /**
107155
+ * @returns Promise object is a dictionary of the preference center data
108156
+ */

packages/react-native-contentpass-cmp-onetrust/README.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,38 @@ yarn add @contentpass/react-native-contentpass-cmp-onetrust
1515
- `@contentpass/react-native-contentpass`
1616
- `react-native-onetrust-cmp` — the OneTrust React Native SDK must be installed and configured in your project
1717

18+
### Required patch for `react-native-onetrust-cmp`
19+
20+
The upstream `react-native-onetrust-cmp` package does not expose `getPreferenceCenterData` and `getBannerData` as native methods, which this adapter requires. You need to apply a patch using [patch-package](https://github.com/ds300/patch-package).
21+
22+
1. Install `patch-package`:
23+
```bash
24+
npm install --save-dev patch-package postinstall-postinstall
25+
```
26+
2. Add a `postinstall` script to your `package.json`:
27+
```json
28+
"scripts": {
29+
"postinstall": "patch-package"
30+
}
31+
```
32+
3. Copy the patch file from [`examples/onetrust/patches/`](../../examples/onetrust/patches/) into a `patches/` directory in your project root.
33+
4. Run `npm install` (or `yarn`) to apply the patch.
34+
35+
### Expo config plugin
36+
37+
This package ships an Expo config plugin that fixes a compatibility issue between `react-native-app-auth` and Expo SDK 55+. To use it, add both plugins to your `app.json`:
38+
39+
```json
40+
{
41+
"expo": {
42+
"plugins": [
43+
"react-native-app-auth",
44+
"@contentpass/react-native-contentpass-cmp-onetrust"
45+
]
46+
}
47+
}
48+
```
49+
1850
## Usage
1951

2052
First, initialize the OneTrust SDK, then create the adapter using `createOnetrustCmpAdapter`:

packages/react-native-contentpass-cmp-onetrust/src/OnetrustCmpAdapter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export async function createOnetrustCmpAdapter(
88
sdk: OTPublishersNativeSDK
99
): Promise<OnetrustCmpAdapter> {
1010
try {
11+
await sdk.fetchPreferencesCmpApiData();
12+
1113
const bannerData = await sdk.getBannerData();
1214

1315
const preferenceCenterData: PreferenceCenterData =

packages/react-native-contentpass-cmp-onetrust/src/react-native-onetrust-cmp.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ declare module 'react-native-onetrust-cmp' {
1515
}
1616

1717
export default interface OTPublishersNativeSDK {
18+
fetchPreferencesCmpApiData(): Promise<void>;
1819
getBannerData(): Promise<any>;
1920
getPreferenceCenterData(): Promise<any>;
2021
saveConsent(interaction: OTConsentInteraction): Promise<void>;

0 commit comments

Comments
 (0)