diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts index 76455861b25..0df5f8dba52 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.spec.ts @@ -82,7 +82,8 @@ describe("VaultHeaderV2Component", () => { numberOfAppliedFilters$, filters$: new BehaviorSubject(emptyForm), filterForm: new FormBuilder().group(emptyForm), - filterVisibilityState: { state$, update }, + filterVisibilityState$: state$, + updateFilterVisibility: update, }, }, { diff --git a/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.ts b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.ts index e5534a06c36..62c164762a9 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/vault-header/vault-header-v2.component.ts @@ -63,7 +63,7 @@ export class VaultHeaderV2Component implements OnInit { ngOnInit(): void { // Get the initial visibility from stored state - this.vaultPopupListFiltersService.filterVisibilityState.state$ + this.vaultPopupListFiltersService.filterVisibilityState$ .pipe( first(), takeUntilDestroyed(this.destroyRef), @@ -85,6 +85,6 @@ export class VaultHeaderV2Component implements OnInit { } this.isDisclosureShown$.next(isShown); - void this.vaultPopupListFiltersService.filterVisibilityState.update(() => isShown); + void this.vaultPopupListFiltersService.updateFilterVisibility(isShown); } } diff --git a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts index 32ad96db2ef..580514de610 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.spec.ts @@ -51,6 +51,9 @@ describe("VaultPopupListFiltersService", () => { policyAppliesToActiveUser$: jest.fn(() => policyAppliesToActiveUser$), }; + const state$ = new BehaviorSubject(false); + const update = jest.fn().mockResolvedValue(undefined); + beforeEach(() => { memberOrganizations$.next([]); decryptedCollections$.next([]); @@ -86,7 +89,7 @@ describe("VaultPopupListFiltersService", () => { }, { provide: StateProvider, - useValue: { getGlobal: () => ({}) }, + useValue: { getGlobal: () => ({ state$, update }) }, }, { provide: FormBuilder, useClass: FormBuilder }, ], @@ -470,4 +473,24 @@ describe("VaultPopupListFiltersService", () => { }); }); }); + + describe("filterVisibilityState", () => { + it("exposes stored state through filterVisibilityState$", (done) => { + state$.next(true); + + service.filterVisibilityState$.subscribe((filterVisibility) => { + expect(filterVisibility).toBeTrue(); + done(); + }); + }); + + it("updates stored filter state", async () => { + await service.updateFilterVisibility(false); + + expect(update).toHaveBeenCalledOnce(); + // Get callback passed to `update` + const updateCallback = update.mock.calls[0][0]; + expect(updateCallback()).toBe(false); + }); + }); }); diff --git a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts index 002b79a0fc2..32eaeb27d4e 100644 --- a/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts +++ b/apps/browser/src/vault/popup/services/vault-popup-list-filters.service.ts @@ -83,7 +83,7 @@ export class VaultPopupListFiltersService { ); /** Stored state for the visibility of the filters. */ - filterVisibilityState = this.stateProvider.getGlobal(FILTER_VISIBILITY_KEY); + private filterVisibilityState = this.stateProvider.getGlobal(FILTER_VISIBILITY_KEY); /** * Static list of ciphers views used in synchronous context @@ -115,6 +115,9 @@ export class VaultPopupListFiltersService { .subscribe(this.validateOrganizationChange.bind(this)); } + /** Stored state for the visibility of the filters. */ + filterVisibilityState$ = this.filterVisibilityState.state$; + /** * Observable whose value is a function that filters an array of `CipherView` objects based on the current filters */ @@ -352,6 +355,11 @@ export class VaultPopupListFiltersService { ), ); + /** Updates the stored state for filter visibility. */ + async updateFilterVisibility(isVisible: boolean): Promise { + await this.filterVisibilityState.update(() => isVisible); + } + /** * Converts the given item into the `ChipSelectOption` structure */