From d9dc3f3962b454e9372b6a1ef49bf95645859bd2 Mon Sep 17 00:00:00 2001 From: cd-bitwarden <106776772+cd-bitwarden@users.noreply.github.com> Date: Thu, 13 Feb 2025 16:04:08 -0500 Subject: [PATCH] [PM-12036] Removing ActiveUserState from vault-onboarding.service.ts (#12898) * Removing ActiveUserState from vault-onboarding.service.ts * changes * trying to fix tests * test fixes * test fixes * fixing tests * fxies * fixes * Update apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts Co-authored-by: SmithThe4th * suggested changes * suggested changes * undoing suggested changes * fixing issue * lint fix * lint fix --------- Co-authored-by: --global <> Co-authored-by: SmithThe4th --- .../abstraction/vault-onboarding.service.ts | 8 ++-- .../services/vault-onboarding.service.ts | 25 ++++++----- .../vault-onboarding.component.spec.ts | 41 +++++++++++++------ .../vault-onboarding.component.ts | 17 ++++++-- 4 files changed, 58 insertions(+), 33 deletions(-) diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/services/abstraction/vault-onboarding.service.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/services/abstraction/vault-onboarding.service.ts index 379c97672e7..7d3ff32c0f8 100644 --- a/apps/web/src/app/vault/individual-vault/vault-onboarding/services/abstraction/vault-onboarding.service.ts +++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/services/abstraction/vault-onboarding.service.ts @@ -1,10 +1,10 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { Observable } from "rxjs"; +import { UserId } from "@bitwarden/common/types/guid"; + import { VaultOnboardingTasks } from "../vault-onboarding.service"; export abstract class VaultOnboardingService { - vaultOnboardingState$: Observable; - abstract setVaultOnboardingTasks(newState: VaultOnboardingTasks): Promise; + abstract setVaultOnboardingTasks(userId: UserId, newState: VaultOnboardingTasks): Promise; + abstract vaultOnboardingState$(userId: UserId): Observable; } diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/services/vault-onboarding.service.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/services/vault-onboarding.service.ts index 95cb568a840..e6f8b815484 100644 --- a/apps/web/src/app/vault/individual-vault/vault-onboarding/services/vault-onboarding.service.ts +++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/services/vault-onboarding.service.ts @@ -1,14 +1,13 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { Injectable } from "@angular/core"; import { Observable } from "rxjs"; import { - ActiveUserState, + SingleUserState, StateProvider, UserKeyDefinition, VAULT_ONBOARDING, } from "@bitwarden/common/platform/state"; +import { UserId } from "@bitwarden/common/types/guid"; import { VaultOnboardingService as VaultOnboardingServiceAbstraction } from "./abstraction/vault-onboarding.service"; @@ -26,20 +25,20 @@ const VAULT_ONBOARDING_KEY = new UserKeyDefinition( clearOn: [], // do not clear tutorials }, ); - @Injectable() export class VaultOnboardingService implements VaultOnboardingServiceAbstraction { - private vaultOnboardingState: ActiveUserState; - vaultOnboardingState$: Observable; + constructor(private stateProvider: StateProvider) {} - constructor(private stateProvider: StateProvider) { - this.vaultOnboardingState = this.stateProvider.getActive(VAULT_ONBOARDING_KEY); - this.vaultOnboardingState$ = this.vaultOnboardingState.state$; + private vaultOnboardingState(userId: UserId): SingleUserState { + return this.stateProvider.getUser(userId, VAULT_ONBOARDING_KEY); } - async setVaultOnboardingTasks(newState: VaultOnboardingTasks): Promise { - await this.vaultOnboardingState.update(() => { - return { ...newState }; - }); + vaultOnboardingState$(userId: UserId): Observable { + return this.vaultOnboardingState(userId).state$; + } + + async setVaultOnboardingTasks(userId: UserId, newState: VaultOnboardingTasks): Promise { + const state = this.vaultOnboardingState(userId); + await state.update(() => ({ ...newState })); } } diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts index 327a077dc6a..62abc0c0b34 100644 --- a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts +++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts @@ -7,9 +7,14 @@ import { Subject, of } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { Utils } from "@bitwarden/common/platform/misc/utils"; import { StateProvider } from "@bitwarden/common/platform/state"; +import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; @@ -24,9 +29,11 @@ describe("VaultOnboardingComponent", () => { let mockPolicyService: MockProxy; let mockI18nService: MockProxy; let mockVaultOnboardingService: MockProxy; - let mockStateProvider: Partial; let setInstallExtLinkSpy: any; let individualVaultPolicyCheckSpy: any; + let mockConfigService: MockProxy; + const mockAccountService: FakeAccountService = mockAccountServiceWith(Utils.newGuid() as UserId); + let mockStateProvider: Partial; beforeEach(() => { mockPolicyService = mock(); @@ -36,6 +43,7 @@ describe("VaultOnboardingComponent", () => { getProfile: jest.fn(), }; mockVaultOnboardingService = mock(); + mockConfigService = mock(); mockStateProvider = { getActive: jest.fn().mockReturnValue( of({ @@ -56,6 +64,8 @@ describe("VaultOnboardingComponent", () => { { provide: VaultOnboardingServiceAbstraction, useValue: mockVaultOnboardingService }, { provide: I18nService, useValue: mockI18nService }, { provide: ApiService, useValue: mockApiService }, + { provide: ConfigService, useValue: mockConfigService }, + { provide: AccountService, useValue: mockAccountService }, { provide: StateProvider, useValue: mockStateProvider }, ], }).compileComponents(); @@ -67,11 +77,15 @@ describe("VaultOnboardingComponent", () => { .mockReturnValue(undefined); jest.spyOn(component, "checkCreationDate").mockReturnValue(null); jest.spyOn(window, "postMessage").mockImplementation(jest.fn()); - (component as any).vaultOnboardingService.vaultOnboardingState$ = of({ - createAccount: true, - importData: false, - installExtension: false, - }); + (component as any).vaultOnboardingService.vaultOnboardingState$ = jest + .fn() + .mockImplementation(() => { + return of({ + createAccount: true, + importData: false, + installExtension: false, + }); + }); }); it("should create", () => { @@ -165,12 +179,15 @@ describe("VaultOnboardingComponent", () => { .spyOn((component as any).vaultOnboardingService, "setVaultOnboardingTasks") .mockReturnValue(Promise.resolve()); - (component as any).vaultOnboardingService.vaultOnboardingState$ = of({ - createAccount: true, - importData: false, - installExtension: false, - }); - + (component as any).vaultOnboardingService.vaultOnboardingState$ = jest + .fn() + .mockImplementation(() => { + return of({ + createAccount: true, + importData: false, + installExtension: false, + }); + }); const eventData = { data: { command: VaultOnboardingMessages.HasBwInstalled } }; (component as any).showOnboarding = true; diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts index e3bd8fc10bd..4b69e3977c6 100644 --- a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts @@ -18,7 +18,11 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getUserId } from "@bitwarden/common/auth/services/account.service"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { UserId } from "@bitwarden/common/types/guid"; import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -57,15 +61,20 @@ export class VaultOnboardingComponent implements OnInit, OnChanges, OnDestroy { protected onboardingTasks$: Observable; protected showOnboarding = false; + private activeId: UserId; constructor( protected platformUtilsService: PlatformUtilsService, protected policyService: PolicyService, private apiService: ApiService, private vaultOnboardingService: VaultOnboardingServiceAbstraction, + private configService: ConfigService, + private accountService: AccountService, ) {} async ngOnInit() { - this.onboardingTasks$ = this.vaultOnboardingService.vaultOnboardingState$; + this.activeId = await firstValueFrom(getUserId(this.accountService.activeAccount$)); + this.onboardingTasks$ = this.vaultOnboardingService.vaultOnboardingState$(this.activeId); + await this.setOnboardingTasks(); this.setInstallExtLink(); this.individualVaultPolicyCheck(); @@ -80,7 +89,7 @@ export class VaultOnboardingComponent implements OnInit, OnChanges, OnDestroy { importData: this.ciphers.length > 0, installExtension: currentTasks.installExtension, }; - await this.vaultOnboardingService.setVaultOnboardingTasks(updatedTasks); + await this.vaultOnboardingService.setVaultOnboardingTasks(this.activeId, updatedTasks); } } @@ -109,7 +118,7 @@ export class VaultOnboardingComponent implements OnInit, OnChanges, OnDestroy { importData: currentTasks.importData, installExtension: true, }; - await this.vaultOnboardingService.setVaultOnboardingTasks(updatedTasks); + await this.vaultOnboardingService.setVaultOnboardingTasks(this.activeId, updatedTasks); } } @@ -152,7 +161,7 @@ export class VaultOnboardingComponent implements OnInit, OnChanges, OnDestroy { private async saveCompletedTasks(vaultTasks: VaultOnboardingTasks) { this.showOnboarding = Object.values(vaultTasks).includes(false); - await this.vaultOnboardingService.setVaultOnboardingTasks(vaultTasks); + await this.vaultOnboardingService.setVaultOnboardingTasks(this.activeId, vaultTasks); } individualVaultPolicyCheck() {