From 4b6ef50611ee5fce6c673e6558204a5da9ae8198 Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Tue, 22 Apr 2025 12:58:33 +0200 Subject: [PATCH 1/2] [DURACOM-353] fix orejime callbacks --- .../cookies/browser-orejime.service.spec.ts | 27 +++++++++++++++++ .../shared/cookies/browser-orejime.service.ts | 30 +++++++++++++++++-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/app/shared/cookies/browser-orejime.service.spec.ts b/src/app/shared/cookies/browser-orejime.service.spec.ts index 126e113227..b0a108e17d 100644 --- a/src/app/shared/cookies/browser-orejime.service.spec.ts +++ b/src/app/shared/cookies/browser-orejime.service.spec.ts @@ -433,4 +433,31 @@ describe('BrowserOrejimeService', () => { expect(service.orejimeConfig.apps).not.toContain(jasmine.objectContaining({ name: googleAnalytics })); }); }); + + describe('applyUpdateSettingsCallbackToApps', () => { + let user2: EPerson; + let mockApp1, mockApp2; + let updateSettingsSpy; + + beforeEach(() => { + user2 = Object.assign(new EPerson(), { uuid: 'test-user' }); + mockApp1 = { name: 'app1', callback: jasmine.createSpy('originalCallback1') }; + mockApp2 = { name: 'app2', callback: jasmine.createSpy('originalCallback2') }; + service.orejimeConfig.apps = [mockApp1, mockApp2]; + updateSettingsSpy = spyOn(service, 'updateSettingsForUsers'); + }); + + it('calls updateSettingsForUsers in a debounced manner when a callback is triggered', (done) => { + service.applyUpdateSettingsCallbackToApps(user2); + + mockApp1.callback(true); + mockApp2.callback(false); + + setTimeout(() => { + expect(updateSettingsSpy).toHaveBeenCalledTimes(1); + expect(updateSettingsSpy).toHaveBeenCalledWith(user2); + done(); + }, 400); + }); + }); }); diff --git a/src/app/shared/cookies/browser-orejime.service.ts b/src/app/shared/cookies/browser-orejime.service.ts index b2d3b6a4c0..e30576ee20 100644 --- a/src/app/shared/cookies/browser-orejime.service.ts +++ b/src/app/shared/cookies/browser-orejime.service.ts @@ -192,12 +192,39 @@ export class BrowserOrejimeService extends OrejimeService { this.translateConfiguration(); this.orejimeConfig.apps = this.filterConfigApps(appsToHide); - this.lazyOrejime.then(({ init }) => { + + this.applyUpdateSettingsCallbackToApps(user); + + void this.lazyOrejime.then(({ init }) => { this.orejimeInstance = init(this.orejimeConfig); }); }); } + /** + * Applies a debounced callback to update user settings for all apps in the Orejime configuration. + * + * This method modifies the `callback` property of each app in the `orejimeConfig.apps` array. + * It ensures that the `updateSettingsForUsers` method is called in a debounced manner whenever + * a consent change occurs for any app. Additionally, it preserves and invokes the original + * callback for each app if one is defined. + * + * @param {EPerson} user - The authenticated user whose settings are being updated. + */ + applyUpdateSettingsCallbackToApps(user: EPerson) { + const updateSettingsCallback = debounce(() => this.updateSettingsForUsers(user), updateDebounce); + + this.orejimeConfig.apps.forEach((app) => { + const originalCallback = app.callback; + app.callback = (consent: boolean) => { + updateSettingsCallback(); + if (originalCallback) { + originalCallback(consent); + } + }; + }); + } + /** * Return saved preferences stored in the orejime cookie */ @@ -220,7 +247,6 @@ export class BrowserOrejimeService extends OrejimeService { * @param user The authenticated user */ private initializeUser(user: EPerson) { - this.orejimeConfig.callback = debounce((consent, app) => this.updateSettingsForUsers(user), updateDebounce); this.orejimeConfig.cookieName = this.getStorageName(user.uuid); const anonCookie = this.cookieService.get(ANONYMOUS_STORAGE_NAME_OREJIME); From 33d75cf217e1e2a3b4712d9156aa69737ec3211e Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Mon, 28 Apr 2025 14:16:13 +0200 Subject: [PATCH 2/2] [DURACOM-353] fix error in SSR --- src/app/shared/cookies/browser-orejime.service.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/shared/cookies/browser-orejime.service.ts b/src/app/shared/cookies/browser-orejime.service.ts index e30576ee20..1296f4c3c1 100644 --- a/src/app/shared/cookies/browser-orejime.service.ts +++ b/src/app/shared/cookies/browser-orejime.service.ts @@ -413,7 +413,9 @@ export class BrowserOrejimeService extends OrejimeService { * @param user */ updateSettingsForUsers(user: EPerson) { - this.setSettingsForUser(user, this.cookieService.get(this.getStorageName(user.uuid))); + if (user) { + this.setSettingsForUser(user, this.cookieService.get(this.getStorageName(user.uuid))); + } } /**