import { Component } from "@angular/core"; import { action } from "@storybook/addon-actions"; import { Meta, StoryObj, moduleMetadata } 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"; import { IconButtonModule } from "../icon-button"; import { BitActionDirective } from "./bit-action.directive"; const template = ` `; @Component({ template, selector: "app-promise-example", }) class PromiseExampleComponent { action = async () => { await new Promise((resolve, reject) => { setTimeout(resolve, 2000); }); }; } @Component({ template, selector: "app-observable-example", }) class ObservableExampleComponent { action = () => { return of("fake observable").pipe(delay(2000)); }; } @Component({ template, selector: "app-rejected-promise-example", }) class RejectedPromiseExampleComponent { action = async () => { await new Promise((resolve, reject) => { setTimeout(() => reject(new Error("Simulated error")), 2000); }); }; } export default { title: "Component Library/Async Actions/Standalone", decorators: [ moduleMetadata({ declarations: [ BitActionDirective, PromiseExampleComponent, ObservableExampleComponent, RejectedPromiseExampleComponent, ], imports: [ButtonModule, IconButtonModule], providers: [ { provide: ValidationService, useValue: { showError: action("ValidationService.showError"), } as Partial, }, { provide: LogService, useValue: { error: action("LogService.error"), } as Partial, }, ], }), ], } as Meta; type PromiseStory = StoryObj; type ObservableStory = StoryObj; export const UsingPromise: PromiseStory = { render: (args) => ({ props: args, template: ``, }), }; export const UsingObservable: ObservableStory = { render: (args) => ({ template: ``, }), }; export const RejectedPromise: ObservableStory = { render: (args) => ({ template: ``, }), };