// FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { Observable, filter, of, switchMap, take } from "rxjs"; import { ActiveUserStateProvider, DeriveDefinition, DerivedState, DerivedStateDependencies, DerivedStateProvider, GlobalStateProvider, SingleUserStateProvider, StateProvider, UserKeyDefinition, } from "@bitwarden/state"; import { UserId } from "@bitwarden/user-core"; export class DefaultStateProvider implements StateProvider { activeUserId$: Observable; constructor( private readonly activeUserStateProvider: ActiveUserStateProvider, private readonly singleUserStateProvider: SingleUserStateProvider, private readonly globalStateProvider: GlobalStateProvider, private readonly derivedStateProvider: DerivedStateProvider, ) { this.activeUserId$ = this.activeUserStateProvider.activeUserId$; } getUserState$(userKeyDefinition: UserKeyDefinition, userId?: UserId): Observable { if (userId) { return this.getUser(userId, userKeyDefinition).state$; } else { return this.activeUserId$.pipe( filter((userId) => userId != null), // Filter out null-ish user ids since we can't get state for a null user id take(1), switchMap((userId) => this.getUser(userId, userKeyDefinition).state$), ); } } getUserStateOrDefault$( userKeyDefinition: UserKeyDefinition, config: { userId: UserId | undefined; defaultValue?: T }, ): Observable { const { userId, defaultValue = null } = config; if (userId) { return this.getUser(userId, userKeyDefinition).state$; } else { return this.activeUserId$.pipe( take(1), switchMap((userId) => userId != null ? this.getUser(userId, userKeyDefinition).state$ : of(defaultValue), ), ); } } async setUserState( userKeyDefinition: UserKeyDefinition, value: T | null, userId?: UserId, ): Promise<[UserId, T | null]> { if (userId) { return [userId, await this.getUser(userId, userKeyDefinition).update(() => value)]; } else { return await this.getActive(userKeyDefinition).update(() => value); } } getActive: InstanceType["get"] = this.activeUserStateProvider.get.bind(this.activeUserStateProvider); getUser: InstanceType["get"] = this.singleUserStateProvider.get.bind(this.singleUserStateProvider); getGlobal: InstanceType["get"] = this.globalStateProvider.get.bind( this.globalStateProvider, ); getDerived: ( parentState$: Observable, deriveDefinition: DeriveDefinition, dependencies: TDeps, ) => DerivedState = this.derivedStateProvider.get.bind(this.derivedStateProvider); }