mirror of
https://github.com/bitwarden/browser
synced 2025-12-13 14:53:33 +00:00
[PM-22270] Only Show Generator Nudge For New Accounts (#15059)
* create new account nudge service to replace repeat nudge services checking for 30 day limit
This commit is contained in:
@@ -1,42 +0,0 @@
|
|||||||
import { Injectable, inject } from "@angular/core";
|
|
||||||
import { Observable, combineLatest, from, of } from "rxjs";
|
|
||||||
import { catchError, map } from "rxjs/operators";
|
|
||||||
|
|
||||||
import { VaultProfileService } from "@bitwarden/angular/vault/services/vault-profile.service";
|
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
|
||||||
import { UserId } from "@bitwarden/common/types/guid";
|
|
||||||
|
|
||||||
import { DefaultSingleNudgeService } from "../default-single-nudge.service";
|
|
||||||
import { NudgeStatus, NudgeType } from "../nudges.service";
|
|
||||||
|
|
||||||
const THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1000;
|
|
||||||
|
|
||||||
@Injectable({ providedIn: "root" })
|
|
||||||
export class DownloadBitwardenNudgeService extends DefaultSingleNudgeService {
|
|
||||||
private vaultProfileService = inject(VaultProfileService);
|
|
||||||
private logService = inject(LogService);
|
|
||||||
|
|
||||||
nudgeStatus$(nudgeType: NudgeType, userId: UserId): Observable<NudgeStatus> {
|
|
||||||
const profileDate$ = from(this.vaultProfileService.getProfileCreationDate(userId)).pipe(
|
|
||||||
catchError(() => {
|
|
||||||
this.logService.error("Failed to load profile date:");
|
|
||||||
// Default to today to ensure the nudge is shown
|
|
||||||
return of(new Date());
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
return combineLatest([
|
|
||||||
profileDate$,
|
|
||||||
this.getNudgeStatus$(nudgeType, userId),
|
|
||||||
of(Date.now() - THIRTY_DAYS_MS),
|
|
||||||
]).pipe(
|
|
||||||
map(([profileCreationDate, status, profileCutoff]) => {
|
|
||||||
const profileOlderThanCutoff = profileCreationDate.getTime() < profileCutoff;
|
|
||||||
return {
|
|
||||||
hasBadgeDismissed: status.hasBadgeDismissed || profileOlderThanCutoff,
|
|
||||||
hasSpotlightDismissed: status.hasSpotlightDismissed || profileOlderThanCutoff,
|
|
||||||
};
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
export * from "./autofill-nudge.service";
|
|
||||||
export * from "./account-security-nudge.service";
|
export * from "./account-security-nudge.service";
|
||||||
export * from "./has-items-nudge.service";
|
export * from "./has-items-nudge.service";
|
||||||
export * from "./download-bitwarden-nudge.service";
|
|
||||||
export * from "./empty-vault-nudge.service";
|
export * from "./empty-vault-nudge.service";
|
||||||
export * from "./vault-settings-import-nudge.service";
|
export * from "./vault-settings-import-nudge.service";
|
||||||
export * from "./new-item-nudge.service";
|
export * from "./new-item-nudge.service";
|
||||||
|
export * from "./new-account-nudge.service";
|
||||||
|
|||||||
@@ -12,16 +12,16 @@ import { NudgeStatus, NudgeType } from "../nudges.service";
|
|||||||
const THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1000;
|
const THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom Nudge Service to use for the Autofill Nudge in the Vault
|
* Custom Nudge Service to check if account is older than 30 days
|
||||||
*/
|
*/
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: "root",
|
providedIn: "root",
|
||||||
})
|
})
|
||||||
export class AutofillNudgeService extends DefaultSingleNudgeService {
|
export class NewAccountNudgeService extends DefaultSingleNudgeService {
|
||||||
vaultProfileService = inject(VaultProfileService);
|
vaultProfileService = inject(VaultProfileService);
|
||||||
logService = inject(LogService);
|
logService = inject(LogService);
|
||||||
|
|
||||||
nudgeStatus$(_: NudgeType, userId: UserId): Observable<NudgeStatus> {
|
nudgeStatus$(nudgeType: NudgeType, userId: UserId): Observable<NudgeStatus> {
|
||||||
const profileDate$ = from(this.vaultProfileService.getProfileCreationDate(userId)).pipe(
|
const profileDate$ = from(this.vaultProfileService.getProfileCreationDate(userId)).pipe(
|
||||||
catchError(() => {
|
catchError(() => {
|
||||||
this.logService.error("Error getting profile creation date");
|
this.logService.error("Error getting profile creation date");
|
||||||
@@ -32,7 +32,7 @@ export class AutofillNudgeService extends DefaultSingleNudgeService {
|
|||||||
|
|
||||||
return combineLatest([
|
return combineLatest([
|
||||||
profileDate$,
|
profileDate$,
|
||||||
this.getNudgeStatus$(NudgeType.AutofillNudge, userId),
|
this.getNudgeStatus$(nudgeType, userId),
|
||||||
of(Date.now() - THIRTY_DAYS_MS),
|
of(Date.now() - THIRTY_DAYS_MS),
|
||||||
]).pipe(
|
]).pipe(
|
||||||
map(([profileCreationDate, status, profileCutoff]) => {
|
map(([profileCreationDate, status, profileCutoff]) => {
|
||||||
@@ -19,7 +19,7 @@ import { FakeStateProvider, mockAccountServiceWith } from "../../../../../libs/c
|
|||||||
import {
|
import {
|
||||||
HasItemsNudgeService,
|
HasItemsNudgeService,
|
||||||
EmptyVaultNudgeService,
|
EmptyVaultNudgeService,
|
||||||
DownloadBitwardenNudgeService,
|
NewAccountNudgeService,
|
||||||
VaultSettingsImportNudgeService,
|
VaultSettingsImportNudgeService,
|
||||||
} from "./custom-nudges-services";
|
} from "./custom-nudges-services";
|
||||||
import { DefaultSingleNudgeService } from "./default-single-nudge.service";
|
import { DefaultSingleNudgeService } from "./default-single-nudge.service";
|
||||||
@@ -34,7 +34,7 @@ describe("Vault Nudges Service", () => {
|
|||||||
getFeatureFlag: jest.fn().mockReturnValue(true),
|
getFeatureFlag: jest.fn().mockReturnValue(true),
|
||||||
};
|
};
|
||||||
|
|
||||||
const nudgeServices = [EmptyVaultNudgeService, DownloadBitwardenNudgeService];
|
const nudgeServices = [EmptyVaultNudgeService, NewAccountNudgeService];
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
fakeStateProvider = new FakeStateProvider(mockAccountServiceWith("user-id" as UserId));
|
fakeStateProvider = new FakeStateProvider(mockAccountServiceWith("user-id" as UserId));
|
||||||
@@ -58,8 +58,8 @@ describe("Vault Nudges Service", () => {
|
|||||||
useValue: mock<HasItemsNudgeService>(),
|
useValue: mock<HasItemsNudgeService>(),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
provide: DownloadBitwardenNudgeService,
|
provide: NewAccountNudgeService,
|
||||||
useValue: mock<DownloadBitwardenNudgeService>(),
|
useValue: mock<NewAccountNudgeService>(),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
provide: EmptyVaultNudgeService,
|
provide: EmptyVaultNudgeService,
|
||||||
|
|||||||
@@ -8,10 +8,9 @@ import { UserId } from "@bitwarden/common/types/guid";
|
|||||||
import { UnionOfValues } from "@bitwarden/common/vault/types/union-of-values";
|
import { UnionOfValues } from "@bitwarden/common/vault/types/union-of-values";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
NewAccountNudgeService,
|
||||||
HasItemsNudgeService,
|
HasItemsNudgeService,
|
||||||
EmptyVaultNudgeService,
|
EmptyVaultNudgeService,
|
||||||
AutofillNudgeService,
|
|
||||||
DownloadBitwardenNudgeService,
|
|
||||||
NewItemNudgeService,
|
NewItemNudgeService,
|
||||||
AccountSecurityNudgeService,
|
AccountSecurityNudgeService,
|
||||||
VaultSettingsImportNudgeService,
|
VaultSettingsImportNudgeService,
|
||||||
@@ -56,6 +55,7 @@ export const NUDGE_DISMISSED_DISK_KEY = new UserKeyDefinition<
|
|||||||
})
|
})
|
||||||
export class NudgesService {
|
export class NudgesService {
|
||||||
private newItemNudgeService = inject(NewItemNudgeService);
|
private newItemNudgeService = inject(NewItemNudgeService);
|
||||||
|
private newAcctNudgeService = inject(NewAccountNudgeService);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom nudge services to use for specific nudge types
|
* Custom nudge services to use for specific nudge types
|
||||||
@@ -67,8 +67,9 @@ export class NudgesService {
|
|||||||
[NudgeType.EmptyVaultNudge]: inject(EmptyVaultNudgeService),
|
[NudgeType.EmptyVaultNudge]: inject(EmptyVaultNudgeService),
|
||||||
[NudgeType.VaultSettingsImportNudge]: inject(VaultSettingsImportNudgeService),
|
[NudgeType.VaultSettingsImportNudge]: inject(VaultSettingsImportNudgeService),
|
||||||
[NudgeType.AccountSecurity]: inject(AccountSecurityNudgeService),
|
[NudgeType.AccountSecurity]: inject(AccountSecurityNudgeService),
|
||||||
[NudgeType.AutofillNudge]: inject(AutofillNudgeService),
|
[NudgeType.AutofillNudge]: this.newAcctNudgeService,
|
||||||
[NudgeType.DownloadBitwarden]: inject(DownloadBitwardenNudgeService),
|
[NudgeType.DownloadBitwarden]: this.newAcctNudgeService,
|
||||||
|
[NudgeType.GeneratorNudgeStatus]: this.newAcctNudgeService,
|
||||||
[NudgeType.NewLoginItemStatus]: this.newItemNudgeService,
|
[NudgeType.NewLoginItemStatus]: this.newItemNudgeService,
|
||||||
[NudgeType.NewCardItemStatus]: this.newItemNudgeService,
|
[NudgeType.NewCardItemStatus]: this.newItemNudgeService,
|
||||||
[NudgeType.NewIdentityItemStatus]: this.newItemNudgeService,
|
[NudgeType.NewIdentityItemStatus]: this.newItemNudgeService,
|
||||||
|
|||||||
Reference in New Issue
Block a user