diff --git a/libs/components/src/async-actions/bit-action.directive.ts b/libs/components/src/async-actions/bit-action.directive.ts index 4fb28a4b1f..0ea479f190 100644 --- a/libs/components/src/async-actions/bit-action.directive.ts +++ b/libs/components/src/async-actions/bit-action.directive.ts @@ -1,6 +1,7 @@ import { Directive, HostListener, Input, OnDestroy, Optional } from "@angular/core"; import { BehaviorSubject, finalize, Subject, takeUntil, tap } from "rxjs"; +import { LogService } from "@bitwarden/common/abstractions/log.service"; import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { ButtonLikeAbstraction } from "../shared/button-like.abstraction"; @@ -23,7 +24,8 @@ export class BitActionDirective implements OnDestroy { constructor( private buttonComponent: ButtonLikeAbstraction, - @Optional() private validationService?: ValidationService + @Optional() private validationService?: ValidationService, + @Optional() private logService?: LogService ) {} get loading() { @@ -44,7 +46,12 @@ export class BitActionDirective implements OnDestroy { this.loading = true; functionToObservable(this.handler) .pipe( - tap({ error: (err: unknown) => this.validationService?.showError(err) }), + tap({ + error: (err: unknown) => { + this.logService?.error(`Async action exception: ${err}`); + this.validationService?.showError(err); + }, + }), finalize(() => (this.loading = false)), takeUntil(this.destroy$) ) diff --git a/libs/components/src/async-actions/bit-submit.directive.ts b/libs/components/src/async-actions/bit-submit.directive.ts index 1fee5283bd..82b459c2d5 100644 --- a/libs/components/src/async-actions/bit-submit.directive.ts +++ b/libs/components/src/async-actions/bit-submit.directive.ts @@ -2,6 +2,7 @@ import { Directive, Input, OnDestroy, OnInit, Optional } from "@angular/core"; import { FormGroupDirective } from "@angular/forms"; import { BehaviorSubject, catchError, filter, of, Subject, switchMap, takeUntil } from "rxjs"; +import { LogService } from "@bitwarden/common/abstractions/log.service"; import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { FunctionReturningAwaitable, functionToObservable } from "../utils/function-to-observable"; @@ -24,7 +25,8 @@ export class BitSubmitDirective implements OnInit, OnDestroy { constructor( private formGroupDirective: FormGroupDirective, - @Optional() validationService?: ValidationService + @Optional() validationService?: ValidationService, + @Optional() logService?: LogService ) { formGroupDirective.ngSubmit .pipe( @@ -39,6 +41,7 @@ export class BitSubmitDirective implements OnInit, OnDestroy { return awaitable.pipe( catchError((err: unknown) => { + logService?.error(`Async submit exception: ${err}`); validationService?.showError(err); return of(undefined); }) diff --git a/libs/components/src/async-actions/standalone.stories.ts b/libs/components/src/async-actions/standalone.stories.ts index cd0c6239b0..5a8edfaaac 100644 --- a/libs/components/src/async-actions/standalone.stories.ts +++ b/libs/components/src/async-actions/standalone.stories.ts @@ -3,6 +3,7 @@ import { action } from "@storybook/addon-actions"; import { Meta, moduleMetadata, Story } from "@storybook/angular"; import { delay, of } from "rxjs"; +import { LogService } from "@bitwarden/common/abstractions/log.service"; import { ValidationService } from "@bitwarden/common/abstractions/validation.service"; import { ButtonModule } from "../button"; @@ -68,6 +69,12 @@ export default { showError: action("ValidationService.showError"), } as Partial, }, + { + provide: LogService, + useValue: { + error: action("LogService.error"), + } as Partial, + }, ], }), ],