mirror of
https://github.com/bitwarden/browser
synced 2025-12-06 00:13:28 +00:00
* add account created date to the account information * set permanent dismissal flag when the user selects that they can access their email * update the logic of device verification notice * add service to cache the profile creation date to avoid calling the API multiple times * update step one logic for new device verification + add tests * update step two logic for new device verification + add tests - remove remind me later link for permanent logic * migrate 2FA check to use the profile property rather than hitting the API directly. The API for 2FA providers is only available on web so it didn't work for browser & native. * remove unneeded account related changes - profile creation is used from other sources * remove obsolete test * store the profile id within the vault service * remove unused map * store the associated profile id so account for profile switching in the extension * add comment for temporary service and ticket number to remove * formatting * move up logic for feature flags
115 lines
3.7 KiB
TypeScript
115 lines
3.7 KiB
TypeScript
import { CommonModule } from "@angular/common";
|
|
import { Component, OnInit } from "@angular/core";
|
|
import { FormBuilder, FormControl, ReactiveFormsModule } from "@angular/forms";
|
|
import { Router } from "@angular/router";
|
|
import { firstValueFrom, Observable } from "rxjs";
|
|
|
|
import { JslibModule } from "@bitwarden/angular/jslib.module";
|
|
import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service";
|
|
import { ClientType } from "@bitwarden/common/enums";
|
|
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
|
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 {
|
|
AsyncActionsModule,
|
|
ButtonModule,
|
|
CardComponent,
|
|
FormFieldModule,
|
|
RadioButtonModule,
|
|
TypographyModule,
|
|
} from "@bitwarden/components";
|
|
|
|
import {
|
|
NewDeviceVerificationNotice,
|
|
NewDeviceVerificationNoticeService,
|
|
} from "./../../services/new-device-verification-notice.service";
|
|
|
|
@Component({
|
|
standalone: true,
|
|
selector: "app-new-device-verification-notice-page-one",
|
|
templateUrl: "./new-device-verification-notice-page-one.component.html",
|
|
imports: [
|
|
CardComponent,
|
|
CommonModule,
|
|
JslibModule,
|
|
TypographyModule,
|
|
ButtonModule,
|
|
RadioButtonModule,
|
|
FormFieldModule,
|
|
AsyncActionsModule,
|
|
ReactiveFormsModule,
|
|
],
|
|
})
|
|
export class NewDeviceVerificationNoticePageOneComponent implements OnInit {
|
|
protected formGroup = this.formBuilder.group({
|
|
hasEmailAccess: new FormControl(0),
|
|
});
|
|
protected isDesktop: boolean;
|
|
readonly currentAcct$: Observable<Account | null> = this.accountService.activeAccount$;
|
|
protected currentEmail: string = "";
|
|
private currentUserId: UserId | null = null;
|
|
|
|
constructor(
|
|
private formBuilder: FormBuilder,
|
|
private router: Router,
|
|
private accountService: AccountService,
|
|
private newDeviceVerificationNoticeService: NewDeviceVerificationNoticeService,
|
|
private platformUtilsService: PlatformUtilsService,
|
|
private configService: ConfigService,
|
|
) {
|
|
this.isDesktop = this.platformUtilsService.getClientType() === ClientType.Desktop;
|
|
}
|
|
|
|
async ngOnInit() {
|
|
const currentAcct = await firstValueFrom(this.currentAcct$);
|
|
if (!currentAcct) {
|
|
return;
|
|
}
|
|
this.currentEmail = currentAcct.email;
|
|
this.currentUserId = currentAcct.id;
|
|
}
|
|
|
|
submit = async () => {
|
|
const doesNotHaveEmailAccess = this.formGroup.controls.hasEmailAccess.value === 0;
|
|
|
|
if (doesNotHaveEmailAccess) {
|
|
await this.router.navigate(["new-device-notice/setup"]);
|
|
return;
|
|
}
|
|
|
|
const tempNoticeFlag = await this.configService.getFeatureFlag(
|
|
FeatureFlag.NewDeviceVerificationTemporaryDismiss,
|
|
);
|
|
const permNoticeFlag = await this.configService.getFeatureFlag(
|
|
FeatureFlag.NewDeviceVerificationPermanentDismiss,
|
|
);
|
|
|
|
let newNoticeState: NewDeviceVerificationNotice | null = null;
|
|
|
|
// When the temporary flag is enabled, only update the `last_dismissal`
|
|
if (tempNoticeFlag) {
|
|
newNoticeState = {
|
|
last_dismissal: new Date(),
|
|
permanent_dismissal: false,
|
|
};
|
|
} else if (permNoticeFlag) {
|
|
// When the per flag is enabled, only update the `last_dismissal`
|
|
newNoticeState = {
|
|
last_dismissal: new Date(),
|
|
permanent_dismissal: true,
|
|
};
|
|
}
|
|
|
|
// This shouldn't occur as the user shouldn't get here unless one of the flags is active.
|
|
if (newNoticeState) {
|
|
await this.newDeviceVerificationNoticeService.updateNewDeviceVerificationNoticeState(
|
|
this.currentUserId!,
|
|
newNoticeState,
|
|
);
|
|
}
|
|
|
|
await this.router.navigate(["/vault"]);
|
|
};
|
|
}
|