1
0
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:
Jason Ng
2025-06-06 09:53:08 -04:00
committed by GitHub
parent 93743a7bcd
commit fdd4d4b9fe
5 changed files with 14 additions and 56 deletions

View File

@@ -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,
};
}),
);
}
}

View File

@@ -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";

View File

@@ -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]) => {

View File

@@ -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,

View File

@@ -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,