diff --git a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html index 01b96e3bc5..5c03a8c431 100644 --- a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html +++ b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.html @@ -27,6 +27,7 @@ bitIconButton="bwi-generate" bitSuffix [appA11yTitle]="'generatePassword' | i18n" + (click)="generatePassword()" data-testid="generate-password" > {{ "sendPasswordDescV2" | i18n }} diff --git a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts index a73a3a6ad8..4f95a6bcee 100644 --- a/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts +++ b/libs/tools/send/send-ui/src/send-form/components/options/send-options.component.ts @@ -2,7 +2,7 @@ import { CommonModule } from "@angular/common"; import { Component, Input, OnInit } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { FormBuilder, ReactiveFormsModule } from "@angular/forms"; -import { map } from "rxjs"; +import { firstValueFrom, map } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; @@ -17,6 +17,7 @@ import { SectionHeaderComponent, TypographyModule, } from "@bitwarden/components"; +import { CredentialGeneratorService, Generators } from "@bitwarden/generator-core"; import { SendFormConfig } from "../../abstractions/send-form-config.service"; import { SendFormContainer } from "../../send-form-container"; @@ -72,6 +73,7 @@ export class SendOptionsComponent implements OnInit { private sendFormContainer: SendFormContainer, private formBuilder: FormBuilder, private policyService: PolicyService, + private generatorService: CredentialGeneratorService, ) { this.sendFormContainer.registerChildForm("sendOptionsForm", this.sendOptionsForm); this.policyService @@ -98,6 +100,16 @@ export class SendOptionsComponent implements OnInit { }); } + generatePassword = async () => { + const generatedCredential = await firstValueFrom( + this.generatorService.generate$(Generators.Password), + ); + + this.sendOptionsForm.patchValue({ + password: generatedCredential.credential, + }); + }; + ngOnInit() { if (this.sendFormContainer.originalSendView) { this.sendOptionsForm.patchValue({ diff --git a/libs/tools/send/send-ui/src/send-form/send-form.module.ts b/libs/tools/send/send-ui/src/send-form/send-form.module.ts index 8b004207c1..99db65807a 100644 --- a/libs/tools/send/send-ui/src/send-form/send-form.module.ts +++ b/libs/tools/send/send-ui/src/send-form/send-form.module.ts @@ -1,9 +1,22 @@ import { NgModule } from "@angular/core"; +import { safeProvider } from "@bitwarden/angular/platform/utils/safe-provider"; +import { SafeInjectionToken } from "@bitwarden/angular/services/injection-tokens"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; +import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service"; +import { StateProvider } from "@bitwarden/common/platform/state"; +import { + createRandomizer, + CredentialGeneratorService, + Randomizer, +} from "@bitwarden/generator-core"; + import { SendFormService } from "./abstractions/send-form.service"; import { SendFormComponent } from "./components/send-form.component"; import { DefaultSendFormService } from "./services/default-send-form.service"; +const RANDOMIZER = new SafeInjectionToken("Randomizer"); + @NgModule({ imports: [SendFormComponent], providers: [ @@ -11,6 +24,16 @@ import { DefaultSendFormService } from "./services/default-send-form.service"; provide: SendFormService, useClass: DefaultSendFormService, }, + safeProvider({ + provide: RANDOMIZER, + useFactory: createRandomizer, + deps: [CryptoService], + }), + safeProvider({ + useClass: CredentialGeneratorService, + provide: CredentialGeneratorService, + deps: [RANDOMIZER, StateProvider, PolicyService], + }), ], exports: [SendFormComponent], })