11import { Injectable } from '@angular/core' ;
2- import { Observable , of , switchMap } from 'rxjs' ;
2+ import { Observable , of , switchMap , combineLatest } from 'rxjs' ;
33import { map , take } from 'rxjs/operators' ;
44import { CookieService } from '../core/services/cookie.service' ;
55import { hasValue , isNotEmpty , hasNoValue } from '../shared/empty.util' ;
@@ -10,6 +10,7 @@ import { getFirstCompletedRemoteData } from '../core/shared/operators';
1010import cloneDeep from 'lodash/cloneDeep' ;
1111import { environment } from '../../environments/environment' ;
1212import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils' ;
13+ import { KlaroService } from '../shared/cookies/klaro.service' ;
1314
1415/**
1516 * Name of the cookie used to store the settings locally
@@ -62,6 +63,7 @@ export class AccessibilitySettingsService {
6263 protected cookieService : CookieService ,
6364 protected authService : AuthService ,
6465 protected ePersonService : EPersonDataService ,
66+ protected klaroService : KlaroService ,
6567 ) {
6668 }
6769
@@ -125,8 +127,9 @@ export class AccessibilitySettingsService {
125127 *
126128 * Returns 'cookie' when the changes were stored in the cookie.
127129 * Returns 'metadata' when the changes were stored in metadata.
130+ * Returns 'failed' when both options failed.
128131 */
129- set ( setting : AccessibilitySetting , value : string ) : Observable < 'cookie' | 'metadata ' > {
132+ set ( setting : AccessibilitySetting , value : string ) : Observable < 'metadata' | ' cookie' | 'failed ' > {
130133 return this . updateSettings ( { [ setting ] : value } ) ;
131134 }
132135
@@ -137,18 +140,15 @@ export class AccessibilitySettingsService {
137140 *
138141 * Returns 'cookie' when the changes were stored in the cookie.
139142 * Returns 'metadata' when the changes were stored in metadata.
143+ * Returns 'failed' when both options failed.
140144 */
141- setSettings ( settings : AccessibilitySettings ) : Observable < 'cookie' | 'metadata ' > {
145+ setSettings ( settings : AccessibilitySettings ) : Observable < 'metadata' | ' cookie' | 'failed ' > {
142146 return this . setSettingsInAuthenticatedUserMetadata ( settings ) . pipe (
143147 take ( 1 ) ,
144- map ( ( succeeded ) => {
145- if ( ! succeeded ) {
146- this . setSettingsInCookie ( settings ) ;
147- return 'cookie' ;
148- } else {
149- return 'metadata' ;
150- }
151- } )
148+ map ( saveLocation => saveLocation === 'metadata' ) ,
149+ switchMap ( ( savedInMetadata ) =>
150+ savedInMetadata ? ofMetadata ( ) : this . setSettingsInCookie ( settings )
151+ ) ,
152152 ) ;
153153 }
154154
@@ -158,8 +158,9 @@ export class AccessibilitySettingsService {
158158 *
159159 * Returns 'cookie' when the changes were stored in the cookie.
160160 * Returns 'metadata' when the changes were stored in metadata.
161+ * Returns 'failed' when both options failed.
161162 */
162- updateSettings ( settings : AccessibilitySettings ) : Observable < 'cookie' | 'metadata ' > {
163+ updateSettings ( settings : AccessibilitySettings ) : Observable < 'metadata' | ' cookie' | 'failed ' > {
163164 return this . getAll ( ) . pipe (
164165 take ( 1 ) ,
165166 map ( currentSettings => Object . assign ( { } , currentSettings , settings ) ) ,
@@ -170,9 +171,9 @@ export class AccessibilitySettingsService {
170171 /**
171172 * Attempts to set the provided settings on the currently authorized user's metadata.
172173 * Emits false when no user is authenticated or when the metadata update failed.
173- * Emits true when the metadata update succeeded.
174+ * Emits 'metadata' when the metadata update succeeded, and 'failed' otherwise .
174175 */
175- setSettingsInAuthenticatedUserMetadata ( settings : AccessibilitySettings ) : Observable < boolean > {
176+ setSettingsInAuthenticatedUserMetadata ( settings : AccessibilitySettings ) : Observable < 'metadata' | 'failed' > {
176177 return this . authService . getAuthenticatedUserFromStoreIfAuthenticated ( ) . pipe (
177178 take ( 1 ) ,
178179 switchMap ( user => {
@@ -181,7 +182,7 @@ export class AccessibilitySettingsService {
181182 const clonedUser = cloneDeep ( user ) ;
182183 return this . setSettingsInMetadata ( clonedUser , settings ) ;
183184 } else {
184- return of ( false ) ;
185+ return ofFailed ( ) ;
185186 }
186187 } )
187188 ) ;
@@ -194,7 +195,7 @@ export class AccessibilitySettingsService {
194195 setSettingsInMetadata (
195196 user : EPerson ,
196197 settings : AccessibilitySettings ,
197- ) : Observable < boolean > {
198+ ) : Observable < 'metadata' | 'failed' > {
198199 if ( isNotEmpty ( settings ) ) {
199200 user . setMetadata ( ACCESSIBILITY_SETTINGS_METADATA_KEY , null , JSON . stringify ( settings ) ) ;
200201 } else {
@@ -206,28 +207,42 @@ export class AccessibilitySettingsService {
206207 switchMap ( operations =>
207208 isNotEmpty ( operations ) ? this . ePersonService . patch ( user , operations ) : createSuccessfulRemoteDataObject$ ( { } ) ) ,
208209 getFirstCompletedRemoteData ( ) ,
209- map ( rd => rd . hasSucceeded ) ,
210+ switchMap ( rd => rd . hasSucceeded ? ofMetadata ( ) : ofFailed ( ) ) ,
210211 ) ;
211212 }
212213
213214 /**
214- * Sets the provided settings in a cookie
215+ * Attempts to set the provided settings in a cookie.
216+ * Emits 'failed' when setting in a cookie failed due to the cookie not being accepted, 'cookie' when it succeeded.
215217 */
216- setSettingsInCookie ( settings : AccessibilitySettings ) {
217- if ( isNotEmpty ( settings ) ) {
218- this . cookieService . set ( ACCESSIBILITY_COOKIE , settings , { expires : environment . accessibility . cookieExpirationDuration } ) ;
219- } else {
220- this . cookieService . remove ( ACCESSIBILITY_COOKIE ) ;
221- }
218+ setSettingsInCookie ( settings : AccessibilitySettings ) : Observable < 'cookie' | 'failed' > {
219+ return this . klaroService . getSavedPreferences ( ) . pipe (
220+ map ( preferences => preferences . accessibility ) ,
221+ map ( ( accessibilityCookieAccepted : boolean ) => {
222+ if ( accessibilityCookieAccepted ) {
223+ if ( isNotEmpty ( settings ) ) {
224+ this . cookieService . set ( ACCESSIBILITY_COOKIE , settings , { expires : environment . accessibility . cookieExpirationDuration } ) ;
225+ } else {
226+ this . cookieService . remove ( ACCESSIBILITY_COOKIE ) ;
227+ }
228+
229+ return 'cookie' ;
230+ } else {
231+ return 'failed' ;
232+ }
233+ } ) ,
234+ ) ;
222235 }
223236
224237 /**
225238 * Clears all settings in the cookie and attempts to clear settings in metadata.
226- * Emits true if settings in metadata were cleared and false otherwise .
239+ * Emits an array mentioning which settings succeeded or failed .
227240 */
228- clearSettings ( ) : Observable < boolean > {
229- this . setSettingsInCookie ( { } ) ;
230- return this . setSettingsInAuthenticatedUserMetadata ( { } ) ;
241+ clearSettings ( ) : Observable < [ 'cookie' | 'failed' , 'metadata' | 'failed' ] > {
242+ return combineLatest ( [
243+ this . setSettingsInCookie ( { } ) ,
244+ this . setSettingsInAuthenticatedUserMetadata ( { } ) ,
245+ ] ) ;
231246 }
232247
233248 /**
@@ -323,3 +338,11 @@ function millisecondsToSeconds(millisecondsStr: string): string {
323338 return ( milliseconds / 1000 ) . toString ( ) ;
324339 }
325340}
341+
342+ function ofMetadata ( ) : Observable < 'metadata' > {
343+ return of ( 'metadata' ) ;
344+ }
345+
346+ function ofFailed ( ) : Observable < 'failed' > {
347+ return of ( 'failed' ) ;
348+ }
0 commit comments