import { Component, Injectable, importProvidersFrom } from "@angular/core";
import { RouterModule } from "@angular/router";
import {
Meta,
Story,
moduleMetadata,
componentWrapperDecorator,
applicationConfig,
} from "@storybook/angular";
import { BehaviorSubject, combineLatest, map } from "rxjs";
import { JslibModule } from "@bitwarden/angular/jslib.module";
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
import { StateService } from "@bitwarden/common/abstractions/state.service";
import {
AvatarModule,
BreadcrumbsModule,
ButtonModule,
IconButtonModule,
IconModule,
MenuModule,
NavigationModule,
TabsModule,
TypographyModule,
InputModule,
} from "@bitwarden/components";
import { PreloadedEnglishI18nModule } from "@bitwarden/web-vault/app/tests/preloaded-english-i18n.module";
import { HeaderComponent } from "./header.component";
@Injectable({
providedIn: "root",
})
class MockStateService {
activeAccount$ = new BehaviorSubject("1").asObservable();
accounts$ = new BehaviorSubject({ "1": { profile: { name: "Foo" } } }).asObservable();
}
class MockMessagingService implements MessagingService {
send(subscriber: string, arg?: any) {
alert(subscriber);
}
}
@Component({
selector: "product-switcher",
template: ``,
})
class MockProductSwitcher {}
@Component({
selector: "dynamic-avatar",
template: ``,
})
class MockDynamicAvatar {
protected name$ = combineLatest([
this.stateService.accounts$,
this.stateService.activeAccount$,
]).pipe(
map(
([accounts, activeAccount]) => accounts[activeAccount as keyof typeof accounts].profile.name
)
);
constructor(private stateService: MockStateService) {}
}
export default {
title: "Web/Header",
component: HeaderComponent,
decorators: [
componentWrapperDecorator(
(story) => `
${story}
`
),
moduleMetadata({
imports: [
JslibModule,
RouterModule,
AvatarModule,
BreadcrumbsModule,
ButtonModule,
IconButtonModule,
IconModule,
InputModule,
MenuModule,
TabsModule,
TypographyModule,
NavigationModule,
],
declarations: [HeaderComponent, MockProductSwitcher, MockDynamicAvatar],
providers: [
{ provide: StateService, useClass: MockStateService },
{
provide: MessagingService,
useFactory: () => {
return new MockMessagingService();
},
},
],
}),
applicationConfig({
providers: [
importProvidersFrom(RouterModule.forRoot([], { useHash: true })),
importProvidersFrom(PreloadedEnglishI18nModule),
],
}),
],
} as Meta;
export const KitchenSink: Story = (args) => ({
props: args,
template: `
Foo
Bar
Foo
Bar
`,
});
export const Basic: Story = (args) => ({
props: args,
template: `
`,
});
export const WithLongTitle: Story = (args) => ({
props: args,
template: `
`,
});
export const WithBreadcrumbs: Story = (args) => ({
props: args,
template: `
Foo
Bar
`,
});
export const WithSearch: Story = (args) => ({
props: args,
template: `
`,
});
export const WithSecondaryContent: Story = (args) => ({
props: args,
template: `
`,
});
export const WithTabs: Story = (args) => ({
props: args,
template: `
Foo
Bar
`,
});
export const WithCustomTitleComponent: Story = (args) => ({
props: args,
template: `
Bitwarden
`,
});