@osano/osano-cmp-react-native 0.19.0 → 0.19.1
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/lib/commonjs/ConsentManager.js +23 -0
- package/lib/commonjs/ConsentManager.js.map +1 -1
- package/lib/commonjs/iab/tcf/iab-storage-utils.js +53 -49
- package/lib/commonjs/iab/tcf/iab-storage-utils.js.map +1 -1
- package/lib/commonjs/iab/tcf/middleware.js +20 -23
- package/lib/commonjs/iab/tcf/middleware.js.map +1 -1
- package/lib/commonjs/iab/tcf/reducer.js +0 -22
- package/lib/commonjs/iab/tcf/reducer.js.map +1 -1
- package/lib/commonjs/index.js +16 -2
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/reducer.js +5 -1
- package/lib/commonjs/reducer.js.map +1 -1
- package/lib/commonjs/services/consent.js +178 -77
- package/lib/commonjs/services/consent.js.map +1 -1
- package/lib/module/ConsentManager.js +23 -0
- package/lib/module/ConsentManager.js.map +1 -1
- package/lib/module/iab/tcf/iab-storage-utils.js +53 -49
- package/lib/module/iab/tcf/iab-storage-utils.js.map +1 -1
- package/lib/module/iab/tcf/middleware.js +22 -25
- package/lib/module/iab/tcf/middleware.js.map +1 -1
- package/lib/module/iab/tcf/reducer.js +1 -23
- package/lib/module/iab/tcf/reducer.js.map +1 -1
- package/lib/module/index.js +17 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/reducer.js +5 -1
- package/lib/module/reducer.js.map +1 -1
- package/lib/module/services/consent.js +174 -75
- package/lib/module/services/consent.js.map +1 -1
- package/lib/typescript/src/ConsentManager.d.ts +11 -1
- package/lib/typescript/src/ConsentManager.d.ts.map +1 -1
- package/lib/typescript/src/iab/tcf/iab-storage-utils.d.ts +7 -7
- package/lib/typescript/src/iab/tcf/iab-storage-utils.d.ts.map +1 -1
- package/lib/typescript/src/iab/tcf/middleware.d.ts.map +1 -1
- package/lib/typescript/src/iab/tcf/reducer.d.ts +1 -0
- package/lib/typescript/src/iab/tcf/reducer.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/reducer.d.ts.map +1 -1
- package/lib/typescript/src/services/consent.d.ts +28 -0
- package/lib/typescript/src/services/consent.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/ConsentManager.ts +24 -1
- package/src/iab/tcf/iab-storage-utils.ts +101 -56
- package/src/iab/tcf/middleware.ts +36 -32
- package/src/iab/tcf/reducer.ts +2 -29
- package/src/index.tsx +15 -1
- package/src/reducer.ts +4 -0
- package/src/services/consent.ts +220 -86
- package/src/types/consent-config.d.ts +5 -1
- package/src/types/store.d.ts +5 -0
|
@@ -32,7 +32,7 @@ export declare class ConsentConfig extends EventEmitter {
|
|
|
32
32
|
get enableDoNotSellDefault(): boolean;
|
|
33
33
|
get doNotSellCategories(): string[];
|
|
34
34
|
get forceManagePreferences(): boolean;
|
|
35
|
-
get forceReconsent():
|
|
35
|
+
get forceReconsent(): number | undefined;
|
|
36
36
|
get googleConsent(): boolean;
|
|
37
37
|
get timeoutSeconds(): number;
|
|
38
38
|
get storagePolicyHref(): string;
|
|
@@ -137,8 +137,18 @@ export declare class ConsentManager {
|
|
|
137
137
|
private _overridePalette?;
|
|
138
138
|
private _googleConsentModeCallback?;
|
|
139
139
|
private _consentExpirationTestingSeconds?;
|
|
140
|
+
private _consentInvalidated;
|
|
141
|
+
private _consentPromptRequired;
|
|
140
142
|
private _deviceId;
|
|
141
143
|
get deviceId(): string;
|
|
144
|
+
/**
|
|
145
|
+
* True when the most recent load invalidated local consent data.
|
|
146
|
+
*/
|
|
147
|
+
get consentInvalidated(): boolean;
|
|
148
|
+
set consentInvalidated(value: boolean);
|
|
149
|
+
/** False when fresh remote consent supersedes only the re-prompt. */
|
|
150
|
+
get consentPromptRequired(): boolean;
|
|
151
|
+
set consentPromptRequired(value: boolean);
|
|
142
152
|
/**
|
|
143
153
|
* The debug-only consent expiration testing window, in seconds, or
|
|
144
154
|
* `undefined` when testing mode is disabled. Read by the consent service to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsentManager.d.ts","sourceRoot":"","sources":["../../../src/ConsentManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAGN,KAAK,mBAAmB,EACxB,MAAM,aAAa,CAAC;AACrB,OAAO,OAAO,EAAE,EAAiB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EAEX,aAAa,EAEb,MAAM,EAEN,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACX,YAAY,EACZ,YAAY,EAEZ,gBAAgB,EAChB,QAAQ,EACR,MAAM,aAAa,CAAC;AASrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,YAAY,EAA0B,MAAM,sBAAsB,CAAC;AAE5E,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAK5C,eAAO,MAAM,cAAc,EAAE,MAyE5B,CAAC;AA6EF,qBAAa,aAAc,SAAQ,YAAY;IAC9C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;gBAEd,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAOlD,IAAI;
|
|
1
|
+
{"version":3,"file":"ConsentManager.d.ts","sourceRoot":"","sources":["../../../src/ConsentManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,11 +14,11 @@ export interface IABConsentData {
|
|
|
14
14
|
specialFeatureOptinsString: string;
|
|
15
15
|
enableAdvertiserConsentMode?: boolean;
|
|
16
16
|
}
|
|
17
|
-
export declare const clearAllIABKeys: () => void
|
|
18
|
-
export declare const setAllIABKeys: (consentData: IABConsentData) => void
|
|
19
|
-
export declare const setCustomIABKey: (key: string, value: string) =>
|
|
20
|
-
export declare const setDefaultIABKey: (key: string, value: string) =>
|
|
21
|
-
export declare const setDefaultIABKeyAsInt: (key: string, value: number) =>
|
|
22
|
-
export declare const clearCustomIABKey: (key: string) => void
|
|
23
|
-
export declare const clearDefaultIABKey: (key: string) => void
|
|
17
|
+
export declare const clearAllIABKeys: (additionalCustomKeys?: string[]) => Promise<void>;
|
|
18
|
+
export declare const setAllIABKeys: (consentData: IABConsentData) => Promise<void>;
|
|
19
|
+
export declare const setCustomIABKey: (key: string, value: string) => Promise<string>;
|
|
20
|
+
export declare const setDefaultIABKey: (key: string, value: string) => Promise<string>;
|
|
21
|
+
export declare const setDefaultIABKeyAsInt: (key: string, value: number) => Promise<number>;
|
|
22
|
+
export declare const clearCustomIABKey: (key: string) => Promise<void>;
|
|
23
|
+
export declare const clearDefaultIABKey: (key: string) => Promise<void>;
|
|
24
24
|
//# sourceMappingURL=iab-storage-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iab-storage-utils.d.ts","sourceRoot":"","sources":["../../../../../src/iab/tcf/iab-storage-utils.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+BAA+B,EAAE,MAAM,CAAC;IACxC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gCAAgC,EAAE,MAAM,CAAC;IACzC,0BAA0B,EAAE,MAAM,CAAC;IACnC,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACtC;
|
|
1
|
+
{"version":3,"file":"iab-storage-utils.d.ts","sourceRoot":"","sources":["../../../../../src/iab/tcf/iab-storage-utils.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+BAA+B,EAAE,MAAM,CAAC;IACxC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gCAAgC,EAAE,MAAM,CAAC;IACzC,0BAA0B,EAAE,MAAM,CAAC;IACnC,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACtC;AA6BD,eAAO,MAAM,eAAe,GAC3B,uBAAsB,MAAM,EAAO,KACjC,OAAO,CAAC,IAAI,CA2BZ,CAAC;AAEJ,eAAO,MAAM,aAAa,GAAI,aAAa,cAAc,KAAG,OAAO,CAAC,IAAI,CAwGvE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,MAAM,CAC7C,CAAC;AAE/B,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,MAAM,CACrC,CAAC;AAExC,eAAO,MAAM,qBAAqB,GACjC,KAAK,MAAM,EACX,OAAO,MAAM,KACX,OAAO,CAAC,MAAM,CAA8C,CAAC;AAEhE,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CACX,CAAC;AAElD,eAAO,MAAM,kBAAkB,GAAI,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CACD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../../../src/iab/tcf/middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAU,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../../../src/iab/tcf/middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAU,MAAM,SAAS,CAAC;AAgC5D,eAAO,MAAM,cAAc,EAAE,oBAiM5B,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../../../src/iab/tcf/reducer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAoBjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../../../src/iab/tcf/reducer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAoBjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;CAkBxB,CAAC;AAgDF,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,WAAW,EAAE,cAAc,IAEtD,OAAO,UAAU,GAAG,QAAQ,EAAE,QAAQ,WAAW;;;;;;;;;;;cA1CrD,CAAC;mBAEC,CAAD;;;;;;;;;;;;;;;;;;;;;;;;;EA+KL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwD,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwD,MAAM,OAAO,CAAC;AA8B7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,EAAE,kBAAkB,IAAI,YAAY,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,YAAY,EACX,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,GACnB,MAAM,6BAA6B,CAAC;AAQrC,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAC1C,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,CA6QnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../src/reducer.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAc,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAUzE,eAAO,MAAM,IAAI,GAAI,aAAa,UAAU,GAAG,GAAG,KAAG,UAqBpD,CAAC;AA2BF,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../src/reducer.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAc,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAUzE,eAAO,MAAM,IAAI,GAAI,aAAa,UAAU,GAAG,GAAG,KAAG,UAqBpD,CAAC;AA2BF,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,UAAU,CA6Q1E"}
|
|
@@ -27,6 +27,34 @@ export type ConsentLookupResponseType = {
|
|
|
27
27
|
export declare const storeConsent: (cmp: ConsentManager, consent?: ConsentCategoryType[], recordedRemotely?: boolean, consentDate?: string | Date) => Promise<ConsentCategoryType[]>;
|
|
28
28
|
export declare const clearConsent: (cmp: ConsentManager) => Promise<ConsentCategoryType[]>;
|
|
29
29
|
export declare const migrateConsentStorage: (cmp: ConsentManager) => Promise<ConsentCategoryType[] | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Resolves the effective `forceReconsent` signal in whole seconds, validating
|
|
32
|
+
* before trusting it. The raw field ships over the network and is human-edited,
|
|
33
|
+
* so treat any malformed value as "no signal" (null) rather than invalidating
|
|
34
|
+
* every consent:
|
|
35
|
+
*
|
|
36
|
+
* - absent / null → null (no signal)
|
|
37
|
+
* - <= 0 → null (guards zero and negatives)
|
|
38
|
+
* - in the future → null (clock skew, or a value mistakenly stamped in
|
|
39
|
+
* milliseconds, which reads as ~1000× "now" ⇒ future)
|
|
40
|
+
*
|
|
41
|
+
* Failing toward *not* invalidating means the worst a bad value causes is a
|
|
42
|
+
* missed prompt, never a permanent lockout.
|
|
43
|
+
*/
|
|
44
|
+
export declare const effectiveForceReconsentSeconds: (cmp: ConsentManager) => number | null;
|
|
45
|
+
/**
|
|
46
|
+
* True when a consent record predates the server's `forceReconsent` stamp.
|
|
47
|
+
* `timestamp` is the recorded-consent instant (stored as an ISO/ms string).
|
|
48
|
+
*
|
|
49
|
+
* Unit alignment is the subtle part: the signal is in SECONDS and the timestamp
|
|
50
|
+
* is in MILLISECONDS, so the signal is scaled up (`* 1000`). The boundary is
|
|
51
|
+
* strict `<` — consent recorded exactly at the stamp instant stays valid.
|
|
52
|
+
*
|
|
53
|
+
* A missing/unparseable timestamp fails closed (returns false), so first-run
|
|
54
|
+
* (no timestamp) is not wrongly invalidated. `storeConsent` always co-stamps,
|
|
55
|
+
* so a consented-but-timestampless record is unreachable here anyway.
|
|
56
|
+
*/
|
|
57
|
+
export declare const predatesForceReconsent: (cmp: ConsentManager, timestamp: string | number | Date | null | undefined) => boolean;
|
|
30
58
|
/**
|
|
31
59
|
* Returns true when the locally stored consent has aged past its expiration
|
|
32
60
|
* window (see {@link effectiveExpirationSeconds}).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../src/services/consent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAEN,KAAK,mBAAmB,EAIxB,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAsBtD,MAAM,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACvC,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACtB,CAAC;
|
|
1
|
+
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../src/services/consent.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@osano/osano-cmp-react-native",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.1",
|
|
4
4
|
"description": "Package and example for the react-native Osano CMP SDK",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
],
|
|
32
32
|
"scripts": {
|
|
33
33
|
"example": "yarn workspace osano-cmp-sdk-example",
|
|
34
|
-
"test": "jest src/services/__tests__/consent.test.ts src/services/__tests__/gdprMappings.test.ts src/services/__tests__/fetchConfig.test.ts src/__tests__/index.test.tsx src/services/__tests__/google-consent-mode.test.ts src/__tests__/OsanoLogger.test.ts src/__tests__/constants.test.ts src/__tests__/doNotSell.test.ts src/__tests__/doNotSell.regression.test.ts src/__tests__/reducer.test.ts src/__tests__/selectors.test.ts src/__tests__/ConsentManager.test.ts src/__tests__/ConsentUiBuilder.test.tsx src/views/Drawer/__tests__/Drawer.ConsentCategories.test.tsx src/utils/__tests__/WebStorage.test.ts src/native/__tests__/OsanoCmp.test.ts",
|
|
35
|
-
"test:legacy": "REACT_NATIVE_NEW_ARCH_ENABLED=false jest src/services/__tests__/consent.test.ts src/services/__tests__/gdprMappings.test.ts src/services/__tests__/fetchConfig.test.ts src/__tests__/index.test.tsx src/services/__tests__/google-consent-mode.test.ts src/__tests__/OsanoLogger.test.ts src/__tests__/constants.test.ts src/__tests__/doNotSell.test.ts src/__tests__/doNotSell.regression.test.ts src/__tests__/reducer.test.ts src/__tests__/selectors.test.ts src/__tests__/ConsentManager.test.ts src/__tests__/ConsentUiBuilder.test.tsx src/views/Drawer/__tests__/Drawer.ConsentCategories.test.tsx src/utils/__tests__/WebStorage.test.ts src/native/__tests__/OsanoCmp.test.ts",
|
|
36
|
-
"test:newarch": "REACT_NATIVE_NEW_ARCH_ENABLED=true jest src/services/__tests__/consent.test.ts src/services/__tests__/gdprMappings.test.ts src/services/__tests__/fetchConfig.test.ts src/__tests__/index.test.tsx src/services/__tests__/google-consent-mode.test.ts src/__tests__/OsanoLogger.test.ts src/__tests__/constants.test.ts src/__tests__/doNotSell.test.ts src/__tests__/doNotSell.regression.test.ts src/__tests__/reducer.test.ts src/__tests__/selectors.test.ts src/__tests__/ConsentManager.test.ts src/__tests__/ConsentUiBuilder.test.tsx src/views/Drawer/__tests__/Drawer.ConsentCategories.test.tsx src/utils/__tests__/WebStorage.test.ts src/native/__tests__/OsanoCmp.test.ts",
|
|
34
|
+
"test": "jest src/services/__tests__/consent.test.ts src/iab/tcf/__tests__/middleware.v2.spec.js src/services/__tests__/gdprMappings.test.ts src/services/__tests__/fetchConfig.test.ts src/__tests__/index.test.tsx src/services/__tests__/google-consent-mode.test.ts src/__tests__/OsanoLogger.test.ts src/__tests__/constants.test.ts src/__tests__/doNotSell.test.ts src/__tests__/doNotSell.regression.test.ts src/__tests__/reducer.test.ts src/__tests__/selectors.test.ts src/__tests__/ConsentManager.test.ts src/__tests__/ConsentUiBuilder.test.tsx src/views/Drawer/__tests__/Drawer.ConsentCategories.test.tsx src/utils/__tests__/WebStorage.test.ts src/native/__tests__/OsanoCmp.test.ts",
|
|
35
|
+
"test:legacy": "REACT_NATIVE_NEW_ARCH_ENABLED=false jest src/services/__tests__/consent.test.ts src/iab/tcf/__tests__/middleware.v2.spec.js src/services/__tests__/gdprMappings.test.ts src/services/__tests__/fetchConfig.test.ts src/__tests__/index.test.tsx src/services/__tests__/google-consent-mode.test.ts src/__tests__/OsanoLogger.test.ts src/__tests__/constants.test.ts src/__tests__/doNotSell.test.ts src/__tests__/doNotSell.regression.test.ts src/__tests__/reducer.test.ts src/__tests__/selectors.test.ts src/__tests__/ConsentManager.test.ts src/__tests__/ConsentUiBuilder.test.tsx src/views/Drawer/__tests__/Drawer.ConsentCategories.test.tsx src/utils/__tests__/WebStorage.test.ts src/native/__tests__/OsanoCmp.test.ts",
|
|
36
|
+
"test:newarch": "REACT_NATIVE_NEW_ARCH_ENABLED=true jest src/services/__tests__/consent.test.ts src/iab/tcf/__tests__/middleware.v2.spec.js src/services/__tests__/gdprMappings.test.ts src/services/__tests__/fetchConfig.test.ts src/__tests__/index.test.tsx src/services/__tests__/google-consent-mode.test.ts src/__tests__/OsanoLogger.test.ts src/__tests__/constants.test.ts src/__tests__/doNotSell.test.ts src/__tests__/doNotSell.regression.test.ts src/__tests__/reducer.test.ts src/__tests__/selectors.test.ts src/__tests__/ConsentManager.test.ts src/__tests__/ConsentUiBuilder.test.tsx src/views/Drawer/__tests__/Drawer.ConsentCategories.test.tsx src/utils/__tests__/WebStorage.test.ts src/native/__tests__/OsanoCmp.test.ts",
|
|
37
37
|
"test:google-consent-mode": "jest src/services/__tests__/google-consent-mode.test.ts",
|
|
38
38
|
"typecheck": "tsc --noEmit",
|
|
39
39
|
"lint": "eslint",
|
package/src/ConsentManager.ts
CHANGED
|
@@ -229,6 +229,7 @@ export class ConsentConfig extends EventEmitter {
|
|
|
229
229
|
DEFAULT_CONFIG.palette,
|
|
230
230
|
config.palette,
|
|
231
231
|
) as Palette;
|
|
232
|
+
delete this._config.forceReconsent;
|
|
232
233
|
this._config = merge(this._config, config) as Config;
|
|
233
234
|
this.emit('loadSuccess', this._config);
|
|
234
235
|
})
|
|
@@ -291,7 +292,7 @@ export class ConsentConfig extends EventEmitter {
|
|
|
291
292
|
get forceManagePreferences(): boolean {
|
|
292
293
|
return this._config.forceManagePreferences;
|
|
293
294
|
}
|
|
294
|
-
get forceReconsent():
|
|
295
|
+
get forceReconsent(): number | undefined {
|
|
295
296
|
return this._config.forceReconsent;
|
|
296
297
|
}
|
|
297
298
|
get googleConsent(): boolean {
|
|
@@ -707,12 +708,32 @@ export class ConsentManager {
|
|
|
707
708
|
private _overridePalette?: Palette;
|
|
708
709
|
private _googleConsentModeCallback?: GoogleConsentModeCallback;
|
|
709
710
|
private _consentExpirationTestingSeconds?: number;
|
|
711
|
+
private _consentInvalidated = false;
|
|
712
|
+
private _consentPromptRequired = false;
|
|
710
713
|
|
|
711
714
|
private _deviceId = '';
|
|
712
715
|
public get deviceId(): string {
|
|
713
716
|
return this._deviceId;
|
|
714
717
|
}
|
|
715
718
|
|
|
719
|
+
/**
|
|
720
|
+
* True when the most recent load invalidated local consent data.
|
|
721
|
+
*/
|
|
722
|
+
public get consentInvalidated(): boolean {
|
|
723
|
+
return this._consentInvalidated;
|
|
724
|
+
}
|
|
725
|
+
public set consentInvalidated(value: boolean) {
|
|
726
|
+
this._consentInvalidated = value;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
/** False when fresh remote consent supersedes only the re-prompt. */
|
|
730
|
+
public get consentPromptRequired(): boolean {
|
|
731
|
+
return this._consentPromptRequired;
|
|
732
|
+
}
|
|
733
|
+
public set consentPromptRequired(value: boolean) {
|
|
734
|
+
this._consentPromptRequired = value;
|
|
735
|
+
}
|
|
736
|
+
|
|
716
737
|
/**
|
|
717
738
|
* The debug-only consent expiration testing window, in seconds, or
|
|
718
739
|
* `undefined` when testing mode is disabled. Read by the consent service to
|
|
@@ -962,6 +983,8 @@ export class ConsentManager {
|
|
|
962
983
|
resolveLoadConfig(
|
|
963
984
|
new Promise((resolve, reject) => {
|
|
964
985
|
this._cancelLoading = reject;
|
|
986
|
+
this._consentInvalidated = false;
|
|
987
|
+
this._consentPromptRequired = false;
|
|
965
988
|
fetchConsent(this)
|
|
966
989
|
.catch(() => {
|
|
967
990
|
// Consent not found
|
|
@@ -29,27 +29,65 @@ export interface IABConsentData {
|
|
|
29
29
|
enableAdvertiserConsentMode?: boolean;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
osanoLogger.info(
|
|
48
|
-
'✅ All IAB consent keys cleared from both custom and default storage',
|
|
32
|
+
let storageQueue = Promise.resolve();
|
|
33
|
+
|
|
34
|
+
const enqueueStorageOperation = <T>(
|
|
35
|
+
operation: () => Promise<T>,
|
|
36
|
+
): Promise<T> => {
|
|
37
|
+
const result = storageQueue.then(operation, operation);
|
|
38
|
+
storageQueue = result.then(
|
|
39
|
+
() => undefined,
|
|
40
|
+
(error) => {
|
|
41
|
+
osanoLogger.error(
|
|
42
|
+
`IAB storage operation failed: ${String(error)}`,
|
|
43
|
+
error instanceof Error ? error : undefined,
|
|
44
|
+
);
|
|
45
|
+
},
|
|
49
46
|
);
|
|
47
|
+
return result;
|
|
50
48
|
};
|
|
51
49
|
|
|
52
|
-
|
|
50
|
+
const enqueueSetStorage = (key: string, value: string) =>
|
|
51
|
+
enqueueStorageOperation(() => setStorage(key, value));
|
|
52
|
+
|
|
53
|
+
const enqueueSetStorageToDefault = (key: string, value: string) =>
|
|
54
|
+
enqueueStorageOperation(() => setStorageToDefault(key, value));
|
|
55
|
+
|
|
56
|
+
const enqueueSetIntStorageToDefault = (key: string, value: number) =>
|
|
57
|
+
enqueueStorageOperation(() => setIntStorageToDefault(key, value));
|
|
58
|
+
|
|
59
|
+
export const clearAllIABKeys = (
|
|
60
|
+
additionalCustomKeys: string[] = [],
|
|
61
|
+
): Promise<void> =>
|
|
62
|
+
enqueueStorageOperation(async () => {
|
|
63
|
+
osanoLogger.info('🧹 Clearing all IAB consent keys...');
|
|
64
|
+
const operations = [
|
|
65
|
+
...Object.values(IABKeys.LEGACY).map((key) =>
|
|
66
|
+
clearStorageFromDefault(key),
|
|
67
|
+
),
|
|
68
|
+
...DEFAULT_STORAGE_KEYS.IABTCF.map((key) => clearStorageFromDefault(key)),
|
|
69
|
+
...[...CUSTOM_STORAGE_KEYS, ...additionalCustomKeys].map((key) =>
|
|
70
|
+
clearStorage(key),
|
|
71
|
+
),
|
|
72
|
+
];
|
|
73
|
+
const failures = await Promise.all(
|
|
74
|
+
operations.map((operation) =>
|
|
75
|
+
operation.then(
|
|
76
|
+
() => ({ failed: false as const }),
|
|
77
|
+
(error: unknown) => ({ failed: true as const, error }),
|
|
78
|
+
),
|
|
79
|
+
),
|
|
80
|
+
);
|
|
81
|
+
const failure = failures.find((result) => result.failed);
|
|
82
|
+
if (failure?.failed) {
|
|
83
|
+
throw failure.error;
|
|
84
|
+
}
|
|
85
|
+
osanoLogger.info(
|
|
86
|
+
'✅ All IAB consent keys cleared from both custom and default storage',
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
export const setAllIABKeys = (consentData: IABConsentData): Promise<void> => {
|
|
53
91
|
const {
|
|
54
92
|
tcString,
|
|
55
93
|
cmpId,
|
|
@@ -72,57 +110,66 @@ export const setAllIABKeys = (consentData: IABConsentData): void => {
|
|
|
72
110
|
const subjectToGDPR = gdprApplies ? '1' : '0';
|
|
73
111
|
|
|
74
112
|
// === Save to Custom Storage ===
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
113
|
+
enqueueSetStorage(IABKeys.IABTCF.CMP_SDK_ID, cmpId.toString());
|
|
114
|
+
enqueueSetStorage(IABKeys.IABTCF.CMP_SDK_VERSION, cmpVersion.toString());
|
|
115
|
+
enqueueSetStorage(IABKeys.IABTCF.POLICY_VERSION, policyVersion);
|
|
116
|
+
enqueueSetStorage(IABKeys.IABTCF.PUBLISHER_CC, publisherCC);
|
|
117
|
+
enqueueSetStorage(IABKeys.IABTCF.GDPR_APPLIES, subjectToGDPR);
|
|
118
|
+
enqueueSetStorage(
|
|
81
119
|
IABKeys.IABTCF.PURPOSE_ONE_TREATMENT,
|
|
82
120
|
purposeOneTreatment ? '1' : '0',
|
|
83
121
|
);
|
|
84
|
-
|
|
122
|
+
enqueueSetStorage(
|
|
85
123
|
IABKeys.IABTCF.USE_NON_STANDARD_TEXTS,
|
|
86
124
|
useNonStandardStacks ? '1' : '0',
|
|
87
125
|
);
|
|
88
|
-
|
|
89
|
-
|
|
126
|
+
enqueueSetStorage(IABKeys.IABTCF.VENDOR_CONSENTS, vendorConsentsString);
|
|
127
|
+
enqueueSetStorage(
|
|
90
128
|
IABKeys.IABTCF.VENDOR_LEGITIMATE_INTERESTS,
|
|
91
129
|
vendorLegitimateInterestsString,
|
|
92
130
|
);
|
|
93
|
-
|
|
94
|
-
|
|
131
|
+
enqueueSetStorage(IABKeys.IABTCF.PURPOSE_CONSENTS, purposeConsentsString);
|
|
132
|
+
enqueueSetStorage(
|
|
95
133
|
IABKeys.IABTCF.PURPOSE_LEGITIMATE_INTERESTS,
|
|
96
134
|
purposeLegitimateInterestsString,
|
|
97
135
|
);
|
|
98
|
-
|
|
136
|
+
enqueueSetStorage(
|
|
99
137
|
IABKeys.IABTCF.SPECIAL_FEATURES_OPT_INS,
|
|
100
138
|
specialFeatureOptinsString,
|
|
101
139
|
);
|
|
102
140
|
|
|
103
141
|
// === Save to Default Storage for AdMob Compatibility ===
|
|
104
142
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
143
|
+
enqueueSetStorageToDefault(IABKeys.LEGACY.CMP_PRESENT, 'true');
|
|
144
|
+
enqueueSetStorageToDefault(IABKeys.LEGACY.SUBJECT_TO_GDPR, subjectToGDPR);
|
|
145
|
+
enqueueSetStorageToDefault(IABKeys.LEGACY.CONSENT_STRING, tcString);
|
|
146
|
+
enqueueSetStorageToDefault(
|
|
109
147
|
IABKeys.LEGACY.PARSED_PURPOSE_CONSENTS,
|
|
110
148
|
purposeConsentsString,
|
|
111
149
|
);
|
|
112
|
-
|
|
150
|
+
enqueueSetStorageToDefault(
|
|
113
151
|
IABKeys.LEGACY.PARSED_VENDOR_CONSENTS,
|
|
114
152
|
vendorConsentsString,
|
|
115
153
|
);
|
|
116
154
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
155
|
+
enqueueSetIntStorageToDefault(
|
|
156
|
+
IABKeys.IABTCF.GDPR_APPLIES,
|
|
157
|
+
gdprApplies ? 1 : 0,
|
|
158
|
+
);
|
|
159
|
+
enqueueSetStorageToDefault(IABKeys.IABTCF.TC_STRING, tcString);
|
|
160
|
+
enqueueSetStorageToDefault(
|
|
161
|
+
IABKeys.IABTCF.PURPOSE_CONSENTS,
|
|
162
|
+
purposeConsentsString,
|
|
163
|
+
);
|
|
164
|
+
enqueueSetStorageToDefault(
|
|
165
|
+
IABKeys.IABTCF.VENDOR_CONSENTS,
|
|
166
|
+
vendorConsentsString,
|
|
167
|
+
);
|
|
168
|
+
enqueueSetStorageToDefault(IABKeys.IABTCF.ADDTL_CONSENT, '');
|
|
122
169
|
|
|
123
170
|
// Handle Google Consent Mode integration
|
|
124
171
|
if (enableAdvertiserConsentMode !== undefined) {
|
|
125
|
-
|
|
172
|
+
enqueueSetIntStorageToDefault(
|
|
126
173
|
IABKeys.IABTCF.ENABLE_ADVERTISER_CONSENT_MODE,
|
|
127
174
|
enableAdvertiserConsentMode ? 1 : 0,
|
|
128
175
|
);
|
|
@@ -143,24 +190,22 @@ export const setAllIABKeys = (consentData: IABConsentData): void => {
|
|
|
143
190
|
osanoLogger.debug(
|
|
144
191
|
`📊 Updated IAB keys: CMP=true, SubjectToGDPR=${subjectToGDPR}, PurposeConsents=${purposeConsentsString.length} chars, VendorConsents=${vendorConsentsString.length} chars`,
|
|
145
192
|
);
|
|
193
|
+
return enqueueStorageOperation(() => Promise.resolve());
|
|
146
194
|
};
|
|
147
195
|
|
|
148
|
-
export const setCustomIABKey = (key: string, value: string):
|
|
149
|
-
|
|
150
|
-
};
|
|
196
|
+
export const setCustomIABKey = (key: string, value: string): Promise<string> =>
|
|
197
|
+
enqueueSetStorage(key, value);
|
|
151
198
|
|
|
152
|
-
export const setDefaultIABKey = (key: string, value: string):
|
|
153
|
-
|
|
154
|
-
};
|
|
199
|
+
export const setDefaultIABKey = (key: string, value: string): Promise<string> =>
|
|
200
|
+
enqueueSetStorageToDefault(key, value);
|
|
155
201
|
|
|
156
|
-
export const setDefaultIABKeyAsInt = (
|
|
157
|
-
|
|
158
|
-
|
|
202
|
+
export const setDefaultIABKeyAsInt = (
|
|
203
|
+
key: string,
|
|
204
|
+
value: number,
|
|
205
|
+
): Promise<number> => enqueueSetIntStorageToDefault(key, value);
|
|
159
206
|
|
|
160
|
-
export const clearCustomIABKey = (key: string): void =>
|
|
161
|
-
clearStorage(key);
|
|
162
|
-
};
|
|
207
|
+
export const clearCustomIABKey = (key: string): Promise<void> =>
|
|
208
|
+
enqueueStorageOperation(() => clearStorage(key));
|
|
163
209
|
|
|
164
|
-
export const clearDefaultIABKey = (key: string): void =>
|
|
165
|
-
clearStorageFromDefault(key);
|
|
166
|
-
};
|
|
210
|
+
export const clearDefaultIABKey = (key: string): Promise<void> =>
|
|
211
|
+
enqueueStorageOperation(() => clearStorageFromDefault(key));
|
|
@@ -8,8 +8,12 @@ import {
|
|
|
8
8
|
setConsent,
|
|
9
9
|
} from './actions';
|
|
10
10
|
import { SET_CONSENT_DATA, setConsentData } from '../actions';
|
|
11
|
-
import {
|
|
12
|
-
|
|
11
|
+
import {
|
|
12
|
+
clearAllIABKeys,
|
|
13
|
+
setAllIABKeys,
|
|
14
|
+
setCustomIABKey,
|
|
15
|
+
} from './iab-storage-utils';
|
|
16
|
+
import { clearStorage, getStorage } from '../../native/OsanoCmp';
|
|
13
17
|
import { getConsentString, getPurposeIds } from './selectors';
|
|
14
18
|
import {
|
|
15
19
|
idRecordToBinaryString,
|
|
@@ -25,12 +29,18 @@ import { Platform } from 'react-native';
|
|
|
25
29
|
import type { Store } from '../../hooks/useThunkReducer';
|
|
26
30
|
import { osanoLogger } from '../../utils/OsanoLogger';
|
|
27
31
|
|
|
32
|
+
const TCF_GPP_SECTIONS = ['tcfeuv2', 'tcfcav1'];
|
|
33
|
+
|
|
28
34
|
export const makeMiddleware: IabMiddlewareFactory = (
|
|
29
35
|
initOptions: IabInitOptions,
|
|
30
36
|
) => {
|
|
31
37
|
const { createConsentPayload, gppSection, version } = initOptions;
|
|
32
38
|
const parseConsentString = makeParseConsentString(initOptions);
|
|
33
39
|
const formatConsentString = makeFormatConsentString(initOptions);
|
|
40
|
+
const clearStoredTcfConsent = (configId: string) =>
|
|
41
|
+
clearAllIABKeys(
|
|
42
|
+
TCF_GPP_SECTIONS.map((section) => `${section}_${configId}`),
|
|
43
|
+
);
|
|
34
44
|
return (store: Store<OsanoState & IabState, OsanoAction>) =>
|
|
35
45
|
(next: (action: OsanoAction) => OsanoState & IabState) =>
|
|
36
46
|
(action: OsanoAction) => {
|
|
@@ -64,6 +74,20 @@ export const makeMiddleware: IabMiddlewareFactory = (
|
|
|
64
74
|
}
|
|
65
75
|
store.dispatch(setConsent(payload));
|
|
66
76
|
};
|
|
77
|
+
// Wipe instead of rehydrating a granted string. A localStorage-only
|
|
78
|
+
// path left IABTCF_* behind; OsanoCmp covers every platform.
|
|
79
|
+
if (newState.consentInvalidated) {
|
|
80
|
+
newState.iab.consentStrings = {
|
|
81
|
+
...newState.iab.consentStrings,
|
|
82
|
+
[gppSection]: '',
|
|
83
|
+
};
|
|
84
|
+
store.dispatch(setConsentData(gppSection, ''));
|
|
85
|
+
clearStoredTcfConsent(configId).then(
|
|
86
|
+
() => resConsent(null),
|
|
87
|
+
() => resConsent(null),
|
|
88
|
+
);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
67
91
|
switch (Platform.OS) {
|
|
68
92
|
case 'ios':
|
|
69
93
|
case 'android':
|
|
@@ -87,20 +111,12 @@ export const makeMiddleware: IabMiddlewareFactory = (
|
|
|
87
111
|
break;
|
|
88
112
|
}
|
|
89
113
|
case CLEAR_CONSENT: {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
clearAllIABKeys();
|
|
96
|
-
break;
|
|
97
|
-
default:
|
|
98
|
-
try {
|
|
99
|
-
window.localStorage.removeItem(`${gppSection}_${configId}`);
|
|
100
|
-
} catch {}
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
114
|
+
newState.iab.consentStrings = {
|
|
115
|
+
...newState.iab.consentStrings,
|
|
116
|
+
[gppSection]: '',
|
|
117
|
+
};
|
|
103
118
|
store.dispatch(setConsentData(gppSection, ''));
|
|
119
|
+
clearStoredTcfConsent(configId).catch(() => {});
|
|
104
120
|
break;
|
|
105
121
|
}
|
|
106
122
|
case SET_ALL_PURPOSE_CONSENT: {
|
|
@@ -147,22 +163,10 @@ export const makeMiddleware: IabMiddlewareFactory = (
|
|
|
147
163
|
case SAVE_BEGIN: {
|
|
148
164
|
if (config && configId) {
|
|
149
165
|
const consentPayload = createConsentPayload(newState);
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
setStorage(
|
|
155
|
-
`${gppSection}_${configId}`,
|
|
156
|
-
JSON.stringify(consentPayload),
|
|
157
|
-
);
|
|
158
|
-
} catch (err) {
|
|
159
|
-
osanoLogger.error(
|
|
160
|
-
`Failed to save consent to device storage: ${err}`,
|
|
161
|
-
err instanceof Error ? err : undefined,
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
+
setCustomIABKey(
|
|
167
|
+
`${gppSection}_${configId}`,
|
|
168
|
+
JSON.stringify(consentPayload),
|
|
169
|
+
);
|
|
166
170
|
store.dispatch(
|
|
167
171
|
setConsentData(gppSection, formatConsentString(config, newState)),
|
|
168
172
|
);
|
|
@@ -183,7 +187,7 @@ export const makeMiddleware: IabMiddlewareFactory = (
|
|
|
183
187
|
osanoLogger.info(`Setting new consent string -> ${value}`);
|
|
184
188
|
const consent = parseConsentString(value);
|
|
185
189
|
|
|
186
|
-
|
|
190
|
+
setCustomIABKey(storageKey, value);
|
|
187
191
|
|
|
188
192
|
const consentData = {
|
|
189
193
|
tcString: value,
|
package/src/iab/tcf/reducer.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CLEAR_CONSENT, RELOAD,
|
|
1
|
+
import { CLEAR_CONSENT, RELOAD, SET_CONFIG } from '../../actions';
|
|
2
2
|
import type { OsanoAction, OsanoState } from '../../types/store';
|
|
3
3
|
import {
|
|
4
4
|
SET_CONSENT,
|
|
@@ -21,8 +21,6 @@ import {
|
|
|
21
21
|
import type { Config } from '../../types/consent-config';
|
|
22
22
|
import type { IabInitOptions } from './types';
|
|
23
23
|
import type { IabState } from '../types';
|
|
24
|
-
import { Platform } from 'react-native';
|
|
25
|
-
import { setStorage } from '../../native/OsanoCmp';
|
|
26
24
|
|
|
27
25
|
export const initialState = {
|
|
28
26
|
iab: {
|
|
@@ -91,7 +89,7 @@ const updateOptions = (
|
|
|
91
89
|
};
|
|
92
90
|
|
|
93
91
|
export default function makeReducer(initOptions: IabInitOptions) {
|
|
94
|
-
const { createConsentPayload,
|
|
92
|
+
const { createConsentPayload, version } = initOptions;
|
|
95
93
|
return (state: OsanoState & IabState, action: OsanoAction) => {
|
|
96
94
|
const { type, payload } = action;
|
|
97
95
|
switch (type) {
|
|
@@ -135,31 +133,6 @@ export default function makeReducer(initOptions: IabInitOptions) {
|
|
|
135
133
|
};
|
|
136
134
|
}
|
|
137
135
|
|
|
138
|
-
case SAVE_BEGIN: {
|
|
139
|
-
const config = state.config;
|
|
140
|
-
if (config?.configId && config.iabEnabled) {
|
|
141
|
-
const consentPayload = createConsentPayload(state);
|
|
142
|
-
switch (Platform.OS) {
|
|
143
|
-
case 'ios':
|
|
144
|
-
case 'android':
|
|
145
|
-
setStorage(
|
|
146
|
-
`${gppSection}_${config.configId}`,
|
|
147
|
-
JSON.stringify(consentPayload),
|
|
148
|
-
);
|
|
149
|
-
break;
|
|
150
|
-
default:
|
|
151
|
-
try {
|
|
152
|
-
window.localStorage.setItem(
|
|
153
|
-
`${gppSection}_${config.configId}`,
|
|
154
|
-
JSON.stringify(consentPayload),
|
|
155
|
-
);
|
|
156
|
-
} catch {}
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return state;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
136
|
case CLEAR_CONSENT: {
|
|
164
137
|
const consentPayload = createConsentPayload();
|
|
165
138
|
return {
|