diff --git a/libs/angular/src/vault/components/vault-items.component.ts b/libs/angular/src/vault/components/vault-items.component.ts index fb76ff500e..fa25bfc825 100644 --- a/libs/angular/src/vault/components/vault-items.component.ts +++ b/libs/angular/src/vault/components/vault-items.component.ts @@ -1,8 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { Directive, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core"; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { BehaviorSubject, Subject, firstValueFrom, from, map, switchMap, takeUntil } from "rxjs"; +import { BehaviorSubject, Subject, firstValueFrom, from, switchMap, takeUntil } from "rxjs"; import { SearchService } from "@bitwarden/common/abstractions/search.service"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; @@ -22,11 +21,9 @@ export class VaultItemsComponent implements OnInit, OnDestroy { loaded = false; ciphers: CipherView[] = []; - searchPlaceholder: string = null; filter: (cipher: CipherView) => boolean = null; deleted = false; organization: Organization; - accessEvents = false; protected searchPending = false; @@ -45,20 +42,7 @@ export class VaultItemsComponent implements OnInit, OnDestroy { protected searchService: SearchService, protected cipherService: CipherService, protected accountService: AccountService, - ) { - this.accountService.activeAccount$ - .pipe( - getUserId, - switchMap((userId) => - this.cipherService.cipherViews$(userId).pipe(map((ciphers) => ({ userId, ciphers }))), - ), - takeUntilDestroyed(), - ) - .subscribe(({ userId, ciphers }) => { - void this.doSearch(ciphers, userId); - this.loaded = true; - }); - } + ) {} ngOnInit(): void { this._searchText$ diff --git a/libs/common/src/vault/services/cipher.service.ts b/libs/common/src/vault/services/cipher.service.ts index e66b6be052..05c875e754 100644 --- a/libs/common/src/vault/services/cipher.service.ts +++ b/libs/common/src/vault/services/cipher.service.ts @@ -980,10 +980,14 @@ export class CipherService implements CipherServiceAbstraction { async upsert(cipher: CipherData | CipherData[]): Promise> { const ciphers = cipher instanceof CipherData ? [cipher] : cipher; - return await this.updateEncryptedCipherState((current) => { + const res = await this.updateEncryptedCipherState((current) => { ciphers.forEach((c) => (current[c.id as CipherId] = c)); return current; }); + // Some state storage providers (e.g. Electron) don't update the state immediately, wait for next tick + // Otherwise, subscribers to cipherViews$ can get stale data + await new Promise((resolve) => setTimeout(resolve, 0)); + return res; } async replace(ciphers: { [id: string]: CipherData }, userId: UserId): Promise { @@ -1000,13 +1004,16 @@ export class CipherService implements CipherServiceAbstraction { userId: UserId = null, ): Promise> { userId ||= await firstValueFrom(this.stateProvider.activeUserId$); - await this.clearDecryptedCiphersState(userId); + await this.clearCache(userId); const updatedCiphers = await this.stateProvider .getUser(userId, ENCRYPTED_CIPHERS) .update((current) => { const result = update(current ?? {}); return result; }); + // Some state storage providers (e.g. Electron) don't update the state immediately, wait for next tick + // Otherwise, subscribers to cipherViews$ can get stale data + await new Promise((resolve) => setTimeout(resolve, 0)); return updatedCiphers; }