@altack/ngx-onetrust
Version:
OneTrust loader & wrapper for Angular
88 lines • 14.2 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { ONE_TRUST_CONFIGURATION } from '../one-trust-configuration.token';
import { appliedLocale$, loadOneTrust, OneTrust$ } from '../util/helpers';
import { distinctUntilChanged, map, startWith, switchMap, takeUntil } from 'rxjs/operators';
import { fromEventPattern, Subject } from 'rxjs';
import * as i0 from "@angular/core";
export class OneTrustService {
constructor(config) {
this.config = config;
this.scriptsLoaded = false;
this.cancelPrev$ = new Subject();
}
loadOneTrust(domainScript) {
if (this.scriptsLoaded) {
console.warn('OneTrust already loaded!');
return;
}
// tslint:disable-next-line:max-line-length
loadOneTrust(domainScript || this.config.domainScript || '', this.config.defaultCountry || '', this.config.documentBasedLanguage || true);
this.scriptsLoaded = true;
}
translateBanner(langAlpha2, force) {
this.cancelPrev$.next();
OneTrust$.pipe(takeUntil(this.cancelPrev$)).subscribe((oneTrust) => {
langAlpha2 = langAlpha2.toLowerCase();
if (force || langAlpha2.length > 2) {
if (appliedLocale$.getValue() !== langAlpha2) {
appliedLocale$.next(langAlpha2);
oneTrust.changeLanguage(langAlpha2);
return;
}
}
// builds a valid xx-YY in order to try to translate the banner using the resulting locale (e.g en-US)
const geolocation = oneTrust.getGeolocationData();
if (geolocation && geolocation.country) {
const targetLocale = `${langAlpha2}-${geolocation.country}`;
if (appliedLocale$.getValue() !== targetLocale) {
appliedLocale$.next(targetLocale);
oneTrust.changeLanguage(targetLocale);
}
}
});
}
oneTrustInstance$() {
return OneTrust$;
}
consentChanged$() {
return OneTrust$.pipe(switchMap((oneTrust) => this.fromConsentChanged(oneTrust)), map((groups) => this.cookiesPermissionMap(groups)), distinctUntilChanged((prev, next) => {
return this.areMapsEquals(prev, next);
}));
}
oneTrustActiveGroups() {
// tslint:disable:no-string-literal
return window['OnetrustActiveGroups'].split(',').filter(Boolean);
}
fromConsentChanged(oneTrustInstance) {
return fromEventPattern((handler) => oneTrustInstance.OnConsentChanged(handler)).pipe(map((event) => event.detail), startWith(this.oneTrustActiveGroups()));
}
cookiesPermissionMap(foundCookies) {
const cookiesGroups = new Map();
// maps found cookies to real cookies groups
Object.keys(this.config.cookiesGroups).forEach((key) => {
// casting is possible because the way the CookiesGroups enum was declared (e.g StrictlyNecessaryCookies = 'StrictlyNecessaryCookies')
const cookieValue = this.config.cookiesGroups[key];
if (foundCookies.includes(cookieValue)) {
cookiesGroups.set(key, true);
}
});
return cookiesGroups;
}
areMapsEquals(prev, next) {
// different sizes means something changed
if (prev.size !== next.size) {
return false;
}
// check if keys from next are the same as keys from prev
return [...next.keys()].every((key) => prev.has(key));
}
}
OneTrustService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OneTrustService, deps: [{ token: ONE_TRUST_CONFIGURATION }], target: i0.ɵɵFactoryTarget.Injectable });
OneTrustService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OneTrustService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OneTrustService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [ONE_TRUST_CONFIGURATION]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLXRydXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtb25ldHJ1c3Qvc3JjL2xpYi9zZXJ2aWNlcy9vbmUtdHJ1c3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUzRSxPQUFPLEVBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUYsT0FBTyxFQUFFLGdCQUFnQixFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFJN0QsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFBb0QsTUFBc0I7UUFBdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFGbEUsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQ21DLENBQUM7SUFFOUUsWUFBWSxDQUFDLFlBQXFCO1FBQ2hDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDekMsT0FBTztTQUNSO1FBQ0QsMkNBQTJDO1FBQzNDLFlBQVksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzFJLElBQUksQ0FB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LENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN0QyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDL0M7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxhQUFhLENBQ2pCLElBQWlDLEVBQ2pDLElBQWlDO1FBRW5DLDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRTtZQUMzQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QseURBQXlEO1FBQ3pELE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDOzs0R0E3RlUsZUFBZSxrQkFHTix1QkFBdUI7Z0hBSGhDLGVBQWU7MkZBQWYsZUFBZTtrQkFEM0IsVUFBVTs7MEJBSUksTUFBTTsyQkFBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ORV9UUlVTVF9DT05GSUdVUkFUSU9OIH0gZnJvbSAnLi4vb25lLXRydXN0LWNvbmZpZ3VyYXRpb24udG9rZW4nO1xuaW1wb3J0IHsgQ29uc2VudEV2ZW50LCBDb29raWVzR3JvdXBzLCBPbmVUcnVzdCwgT25lVHJ1c3RDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2FwcGxpZWRMb2NhbGUkLCBsb2FkT25lVHJ1c3QsIE9uZVRydXN0JH0gZnJvbSAnLi4vdXRpbC9oZWxwZXJzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBmcm9tRXZlbnRQYXR0ZXJuLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOb2RlRXZlbnRIYW5kbGVyIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21FdmVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPbmVUcnVzdFNlcnZpY2Uge1xuICBwcml2YXRlIHNjcmlwdHNMb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjYW5jZWxQcmV2JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoT05FX1RSVVNUX0NPTkZJR1VSQVRJT04pIHB1YmxpYyBjb25maWc6IE9uZVRydXN0Q29uZmlnKSB7fVxuXG4gIGxvYWRPbmVUcnVzdChkb21haW5TY3JpcHQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zY3JpcHRzTG9hZGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09uZVRydXN0IGFscmVhZHkgbG9hZGVkIScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgbG9hZE9uZVRydXN0KGRvbWFpblNjcmlwdCB8fCB0aGlzLmNvbmZpZy5kb21haW5TY3JpcHQgfHwgJycsIHRoaXMuY29uZmlnLmRlZmF1bHRDb3VudHJ5IHx8ICcnLCB0aGlzLmNvbmZpZy5kb2N1bWVudEJhc2VkTGFuZ3VhZ2UgfHwgdHJ1ZSk7XG4gICAgdGhpcy5zY3JpcHRzTG9hZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHRyYW5zbGF0ZUJhbm5lcihsYW5nQWxwaGEyOiBzdHJpbmcsIGZvcmNlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsUHJldiQubmV4dCgpO1xuICAgIE9uZVRydXN0JC5waXBlKHRha2VVbnRpbCh0aGlzLmNhbmNlbFByZXYkKSkuc3Vic2NyaWJlKChvbmVUcnVzdDogT25lVHJ1c3QpID0+IHtcbiAgICAgIGxhbmdBbHBoYTIgPSBsYW5nQWxwaGEyLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoZm9yY2UgfHwgbGFuZ0FscGhhMi5sZW5ndGggPiAyKSB7XG4gICAgICAgIGlmIChhcHBsaWVkTG9jYWxlJC5nZXRWYWx1ZSgpICE9PSBsYW5nQWxwaGEyKSB7XG4gICAgICAgICAgYXBwbGllZExvY2FsZSQubmV4dChsYW5nQWxwaGEyKTtcbiAgICAgICAgICBvbmVUcnVzdC5jaGFuZ2VMYW5ndWFnZShsYW5nQWxwaGEyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGJ1aWxkcyBhIHZhbGlkIHh4LVlZIGluIG9yZGVyIHRvIHRyeSB0byB0cmFuc2xhdGUgdGhlIGJhbm5lciB1c2luZyB0aGUgcmVzdWx0aW5nIGxvY2FsZSAoZS5nIGVuLVVTKVxuICAgICAgY29uc3QgZ2VvbG9jYXRpb24gPSBvbmVUcnVzdC5nZXRHZW9sb2NhdGlvbkRhdGEoKTtcbiAgICAgIGlmIChnZW9sb2NhdGlvbiAmJiBnZW9sb2NhdGlvbi5jb3VudHJ5KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldExvY2FsZSA9IGAke2xhbmdBbHBoYTJ9LSR7Z2VvbG9jYXRpb24uY291bnRyeX1gO1xuICAgICAgICBpZiAoYXBwbGllZExvY2FsZSQuZ2V0VmFsdWUoKSAhPT0gdGFyZ2V0TG9jYWxlKSB7XG4gICAgICAgICAgYXBwbGllZExvY2FsZSQubmV4dCh0YXJnZXRMb2NhbGUpO1xuICAgICAgICAgIG9uZVRydXN0LmNoYW5nZUxhbmd1YWdlKHRhcmdldExvY2FsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uZVRydXN0SW5zdGFuY2UkKCk6IE9ic2VydmFibGU8T25lVHJ1c3Q+IHtcbiAgICByZXR1cm4gT25lVHJ1c3QkO1xuICB9XG5cbiAgY29uc2VudENoYW5nZWQkKCk6IE9ic2VydmFibGU8TWFwPENvb2tpZXNHcm91cHMsIGJvb2xlYW4+PiB7XG4gICAgcmV0dXJuIE9uZVRydXN0JC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKG9uZVRydXN0OiBPbmVUcnVzdCkgPT4gdGhpcy5mcm9tQ29uc2VudENoYW5nZWQob25lVHJ1c3QpKSxcbiAgICAgICAgbWFwKChncm91cHM6IEFycmF5PHN0cmluZz4pID0+IHRoaXMuY29va2llc1Blcm1pc3Npb25NYXAoZ3JvdXBzKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKFxuICAgICAgICAgICAgKHByZXY6IE1hcDxDb29raWVzR3JvdXBzLCBib29sZWFuPiwgbmV4dDogTWFwPENvb2tpZXNHcm91cHMsIGJvb2xlYW4+KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmFyZU1hcHNFcXVhbHMocHJldiwgbmV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvbmVUcnVzdEFjdGl2ZUdyb3VwcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1zdHJpbmctbGl0ZXJhbFxuICAgIHJldHVybiAod2luZG93WydPbmV0cnVzdEFjdGl2ZUdyb3VwcyddIGFzIHN0cmluZykuc3BsaXQoJywnKS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICBwcml2YXRlIGZyb21Db25zZW50Q2hhbmdlZChvbmVUcnVzdEluc3RhbmNlOiBPbmVUcnVzdCk6IE9ic2VydmFibGU8QXJyYXk8c3RyaW5nPj4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIGZyb21FdmVudFBhdHRlcm4oXG4gICAgICAgICAgICAoaGFuZGxlcjogTm9kZUV2ZW50SGFuZGxlcikgPT4gb25lVHJ1c3RJbnN0YW5jZS5PbkNvbnNlbnRDaGFuZ2VkKGhhbmRsZXIpIGFzIENvbnNlbnRFdmVudFxuICAgICAgICApIGFzIE9ic2VydmFibGU8Q29uc2VudEV2ZW50PlxuICAgICkucGlwZShcbiAgICAgICAgbWFwKChldmVudDogQ29uc2VudEV2ZW50KSA9PiBldmVudC5kZXRhaWwpLFxuICAgICAgICBzdGFydFdpdGgodGhpcy5vbmVUcnVzdEFjdGl2ZUdyb3VwcygpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvb2tpZXNQZXJtaXNzaW9uTWFwKGZvdW5kQ29va2llczogQXJyYXk8c3RyaW5nPik6IE1hcDxDb29raWVzR3JvdXBzLCBib29sZWFuPiB7XG4gICAgY29uc3QgY29va2llc0dyb3VwcyA9IG5ldyBNYXA8Q29va2llc0dyb3VwcywgYm9vbGVhbj4oKTtcbiAgICAvLyBtYXBzIGZvdW5kIGNvb2tpZXMgdG8gcmVhbCBjb29raWVzIGdyb3Vwc1xuICAgIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmNvb2tpZXNHcm91cHMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBjYXN0aW5nIGlzIHBvc3NpYmxlIGJlY2F1c2UgdGhlIHdheSB0aGUgQ29va2llc0dyb3VwcyBlbnVtIHdhcyBkZWNsYXJlZCAoZS5nIFN0cmljdGx5TmVjZXNzYXJ5Q29va2llcyA9ICdTdHJpY3RseU5lY2Vzc2FyeUNvb2tpZXMnKVxuICAgICAgY29uc3QgY29va2llVmFsdWUgPSB0aGlzLmNvbmZpZy5jb29raWVzR3JvdXBzW2tleSBhcyBDb29raWVzR3JvdXBzXTtcbiAgICAgIGlmIChmb3VuZENvb2tpZXMuaW5jbHVkZXMoY29va2llVmFsdWUpKSB7XG4gICAgICAgIGNvb2tpZXNHcm91cHMuc2V0KGtleSBhcyBDb29raWVzR3JvdXBzLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29va2llc0dyb3VwcztcbiAgfVxuXG4gIHByaXZhdGUgYXJlTWFwc0VxdWFscyhcbiAgICAgIHByZXY6IE1hcDxDb29raWVzR3JvdXBzLCBib29sZWFuPixcbiAgICAgIG5leHQ6IE1hcDxDb29raWVzR3JvdXBzLCBib29sZWFuPlxuICApOiBib29sZWFuIHtcbiAgICAvLyBkaWZmZXJlbnQgc2l6ZXMgbWVhbnMgc29tZXRoaW5nIGNoYW5nZWRcbiAgICBpZiAocHJldi5zaXplICE9PSBuZXh0LnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gY2hlY2sgaWYga2V5cyBmcm9tIG5leHQgYXJlIHRoZSBzYW1lIGFzIGtleXMgZnJvbSBwcmV2XG4gICAgcmV0dXJuIFsuLi5uZXh0LmtleXMoKV0uZXZlcnkoKGtleTogQ29va2llc0dyb3VwcykgPT4gcHJldi5oYXMoa2V5KSk7XG4gIH1cbn1cbiJdfQ==