1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-15 07:43:35 +00:00

[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 <gsmith@bitwarden.com>

* suggested changes

* suggested changes

* undoing suggested changes

* fixing issue

* lint fix

* lint fix

---------

Co-authored-by: --global <>
Co-authored-by: SmithThe4th <gsmith@bitwarden.com>
This commit is contained in:
cd-bitwarden
2025-02-13 16:04:08 -05:00
committed by GitHub
parent be669a664a
commit d9dc3f3962
4 changed files with 58 additions and 33 deletions

View File

@@ -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 { Observable } from "rxjs";
import { UserId } from "@bitwarden/common/types/guid";
import { VaultOnboardingTasks } from "../vault-onboarding.service"; import { VaultOnboardingTasks } from "../vault-onboarding.service";
export abstract class VaultOnboardingService { export abstract class VaultOnboardingService {
vaultOnboardingState$: Observable<VaultOnboardingTasks>; abstract setVaultOnboardingTasks(userId: UserId, newState: VaultOnboardingTasks): Promise<void>;
abstract setVaultOnboardingTasks(newState: VaultOnboardingTasks): Promise<void>; abstract vaultOnboardingState$(userId: UserId): Observable<VaultOnboardingTasks | null>;
} }

View File

@@ -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 { Injectable } from "@angular/core";
import { Observable } from "rxjs"; import { Observable } from "rxjs";
import { import {
ActiveUserState, SingleUserState,
StateProvider, StateProvider,
UserKeyDefinition, UserKeyDefinition,
VAULT_ONBOARDING, VAULT_ONBOARDING,
} from "@bitwarden/common/platform/state"; } from "@bitwarden/common/platform/state";
import { UserId } from "@bitwarden/common/types/guid";
import { VaultOnboardingService as VaultOnboardingServiceAbstraction } from "./abstraction/vault-onboarding.service"; import { VaultOnboardingService as VaultOnboardingServiceAbstraction } from "./abstraction/vault-onboarding.service";
@@ -26,20 +25,20 @@ const VAULT_ONBOARDING_KEY = new UserKeyDefinition<VaultOnboardingTasks>(
clearOn: [], // do not clear tutorials clearOn: [], // do not clear tutorials
}, },
); );
@Injectable() @Injectable()
export class VaultOnboardingService implements VaultOnboardingServiceAbstraction { export class VaultOnboardingService implements VaultOnboardingServiceAbstraction {
private vaultOnboardingState: ActiveUserState<VaultOnboardingTasks>; constructor(private stateProvider: StateProvider) {}
vaultOnboardingState$: Observable<VaultOnboardingTasks>;
constructor(private stateProvider: StateProvider) { private vaultOnboardingState(userId: UserId): SingleUserState<VaultOnboardingTasks> {
this.vaultOnboardingState = this.stateProvider.getActive(VAULT_ONBOARDING_KEY); return this.stateProvider.getUser(userId, VAULT_ONBOARDING_KEY);
this.vaultOnboardingState$ = this.vaultOnboardingState.state$;
} }
async setVaultOnboardingTasks(newState: VaultOnboardingTasks): Promise<void> { vaultOnboardingState$(userId: UserId): Observable<VaultOnboardingTasks | null> {
await this.vaultOnboardingState.update(() => { return this.vaultOnboardingState(userId).state$;
return { ...newState }; }
});
async setVaultOnboardingTasks(userId: UserId, newState: VaultOnboardingTasks): Promise<void> {
const state = this.vaultOnboardingState(userId);
await state.update(() => ({ ...newState }));
} }
} }

View File

@@ -7,9 +7,14 @@ import { Subject, of } from "rxjs";
import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; 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 { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.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 { 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 { CipherType } from "@bitwarden/common/vault/enums/cipher-type";
import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum";
@@ -24,9 +29,11 @@ describe("VaultOnboardingComponent", () => {
let mockPolicyService: MockProxy<PolicyService>; let mockPolicyService: MockProxy<PolicyService>;
let mockI18nService: MockProxy<I18nService>; let mockI18nService: MockProxy<I18nService>;
let mockVaultOnboardingService: MockProxy<VaultOnboardingServiceAbstraction>; let mockVaultOnboardingService: MockProxy<VaultOnboardingServiceAbstraction>;
let mockStateProvider: Partial<StateProvider>;
let setInstallExtLinkSpy: any; let setInstallExtLinkSpy: any;
let individualVaultPolicyCheckSpy: any; let individualVaultPolicyCheckSpy: any;
let mockConfigService: MockProxy<ConfigService>;
const mockAccountService: FakeAccountService = mockAccountServiceWith(Utils.newGuid() as UserId);
let mockStateProvider: Partial<StateProvider>;
beforeEach(() => { beforeEach(() => {
mockPolicyService = mock<PolicyService>(); mockPolicyService = mock<PolicyService>();
@@ -36,6 +43,7 @@ describe("VaultOnboardingComponent", () => {
getProfile: jest.fn(), getProfile: jest.fn(),
}; };
mockVaultOnboardingService = mock<VaultOnboardingServiceAbstraction>(); mockVaultOnboardingService = mock<VaultOnboardingServiceAbstraction>();
mockConfigService = mock<ConfigService>();
mockStateProvider = { mockStateProvider = {
getActive: jest.fn().mockReturnValue( getActive: jest.fn().mockReturnValue(
of({ of({
@@ -56,6 +64,8 @@ describe("VaultOnboardingComponent", () => {
{ provide: VaultOnboardingServiceAbstraction, useValue: mockVaultOnboardingService }, { provide: VaultOnboardingServiceAbstraction, useValue: mockVaultOnboardingService },
{ provide: I18nService, useValue: mockI18nService }, { provide: I18nService, useValue: mockI18nService },
{ provide: ApiService, useValue: mockApiService }, { provide: ApiService, useValue: mockApiService },
{ provide: ConfigService, useValue: mockConfigService },
{ provide: AccountService, useValue: mockAccountService },
{ provide: StateProvider, useValue: mockStateProvider }, { provide: StateProvider, useValue: mockStateProvider },
], ],
}).compileComponents(); }).compileComponents();
@@ -67,11 +77,15 @@ describe("VaultOnboardingComponent", () => {
.mockReturnValue(undefined); .mockReturnValue(undefined);
jest.spyOn(component, "checkCreationDate").mockReturnValue(null); jest.spyOn(component, "checkCreationDate").mockReturnValue(null);
jest.spyOn(window, "postMessage").mockImplementation(jest.fn()); jest.spyOn(window, "postMessage").mockImplementation(jest.fn());
(component as any).vaultOnboardingService.vaultOnboardingState$ = of({ (component as any).vaultOnboardingService.vaultOnboardingState$ = jest
createAccount: true, .fn()
importData: false, .mockImplementation(() => {
installExtension: false, return of({
}); createAccount: true,
importData: false,
installExtension: false,
});
});
}); });
it("should create", () => { it("should create", () => {
@@ -165,12 +179,15 @@ describe("VaultOnboardingComponent", () => {
.spyOn((component as any).vaultOnboardingService, "setVaultOnboardingTasks") .spyOn((component as any).vaultOnboardingService, "setVaultOnboardingTasks")
.mockReturnValue(Promise.resolve()); .mockReturnValue(Promise.resolve());
(component as any).vaultOnboardingService.vaultOnboardingState$ = of({ (component as any).vaultOnboardingService.vaultOnboardingState$ = jest
createAccount: true, .fn()
importData: false, .mockImplementation(() => {
installExtension: false, return of({
}); createAccount: true,
importData: false,
installExtension: false,
});
});
const eventData = { data: { command: VaultOnboardingMessages.HasBwInstalled } }; const eventData = { data: { command: VaultOnboardingMessages.HasBwInstalled } };
(component as any).showOnboarding = true; (component as any).showOnboarding = true;

View File

@@ -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 { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { PolicyType } from "@bitwarden/common/admin-console/enums";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization"; 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 { 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 { CipherType } from "@bitwarden/common/vault/enums/cipher-type";
import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
@@ -57,15 +61,20 @@ export class VaultOnboardingComponent implements OnInit, OnChanges, OnDestroy {
protected onboardingTasks$: Observable<VaultOnboardingTasks>; protected onboardingTasks$: Observable<VaultOnboardingTasks>;
protected showOnboarding = false; protected showOnboarding = false;
private activeId: UserId;
constructor( constructor(
protected platformUtilsService: PlatformUtilsService, protected platformUtilsService: PlatformUtilsService,
protected policyService: PolicyService, protected policyService: PolicyService,
private apiService: ApiService, private apiService: ApiService,
private vaultOnboardingService: VaultOnboardingServiceAbstraction, private vaultOnboardingService: VaultOnboardingServiceAbstraction,
private configService: ConfigService,
private accountService: AccountService,
) {} ) {}
async ngOnInit() { 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(); await this.setOnboardingTasks();
this.setInstallExtLink(); this.setInstallExtLink();
this.individualVaultPolicyCheck(); this.individualVaultPolicyCheck();
@@ -80,7 +89,7 @@ export class VaultOnboardingComponent implements OnInit, OnChanges, OnDestroy {
importData: this.ciphers.length > 0, importData: this.ciphers.length > 0,
installExtension: currentTasks.installExtension, 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, importData: currentTasks.importData,
installExtension: true, 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) { private async saveCompletedTasks(vaultTasks: VaultOnboardingTasks) {
this.showOnboarding = Object.values(vaultTasks).includes(false); this.showOnboarding = Object.values(vaultTasks).includes(false);
await this.vaultOnboardingService.setVaultOnboardingTasks(vaultTasks); await this.vaultOnboardingService.setVaultOnboardingTasks(this.activeId, vaultTasks);
} }
individualVaultPolicyCheck() { individualVaultPolicyCheck() {