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:
@@ -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>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user