import type { Meta, StoryObj } from "@storybook/angular"; import { moduleMetadata } from "@storybook/angular"; import { CommonModule } from "@angular/common"; import { Component, Input } from "@angular/core"; import { CopilotChatView, CopilotChatMessageView, CopilotChatInput, provideCopilotChatLabels, provideCopilotKit, } from "@copilotkit/angular"; import type { Message } from "@ag-ui/client"; const meta: Meta = { title: "UI/CopilotChatView/Custom Actions", component: CopilotChatView, decorators: [ moduleMetadata({ imports: [ CommonModule, CopilotChatView, CopilotChatMessageView, CopilotChatInput, ], providers: [ provideCopilotKit({}), provideCopilotChatLabels({ chatInputPlaceholder: "Type a message...", chatDisclaimerText: "AI can make mistakes. Please verify important information.", }), ], }), ], parameters: { layout: "fullscreen", }, }; export default meta; type Story = StoryObj; export const ThumbsUpDown: Story = { parameters: { docs: { source: { type: "code", code: `import { Component } from '@angular/core'; import { CommonModule } from '@angular/common'; import { CopilotChatView, CopilotChatMessageView, CopilotChatInput, provideCopilotKit, provideCopilotChatLabels } from '@copilotkit/angular'; import { Message } from '@ag-ui/client'; // Custom disclaimer component @Component({ selector: 'custom-disclaimer', standalone: true, template: \`
🎨 This chat interface is fully customizable!
\` }) class CustomDisclaimerComponent { @Input() text?: string; @Input() inputClass?: string; } @Component({ selector: 'app-chat-actions', standalone: true, imports: [ CommonModule, CopilotChatView, CopilotChatMessageView, CopilotChatInput, CustomDisclaimerComponent ], providers: [ provideCopilotKit({}), provideCopilotChatLabels({ chatInputPlaceholder: "Type a message...", chatDisclaimerText: "AI can make mistakes. Please verify important information.", }) ], template: \`
\` }) export class ChatActionsComponent { messages: Message[] = [ { id: 'user-1', content: 'Hello! Can you help me with TypeScript?', role: 'user' }, { id: 'assistant-1', content: 'Of course! TypeScript is a superset of JavaScript that adds static typing. What would you like to know?', role: 'assistant' } ]; customDisclaimerComponent = CustomDisclaimerComponent; onThumbsUp(event: any) { console.log('Thumbs up!', event); alert('You liked this message!'); } onThumbsDown(event: any) { console.log('Thumbs down!', event); alert('You disliked this message!'); } }`, language: "typescript", }, }, }, render: () => { // Custom disclaimer component @Component({ selector: "custom-disclaimer", standalone: true, template: `
🎨 This chat interface is fully customizable!
`, }) class CustomDisclaimerComponent { // Accept slot-provided inputs to avoid NG0303 @Input() text?: string; @Input() inputClass?: string; } const messages: Message[] = [ { id: "user-1", content: "Hello! Can you help me with TypeScript?", role: "user" as const, }, { id: "assistant-1", content: "Of course! TypeScript is a superset of JavaScript that adds static typing. What would you like to know?", role: "assistant" as const, }, ]; const onThumbsUp = (event: any) => { console.log("Thumbs up!", event); alert("You liked this message!"); }; const onThumbsDown = (event: any) => { console.log("Thumbs down!", event); alert("You disliked this message!"); }; return { template: `
`, props: { messages, customDisclaimerComponent: CustomDisclaimerComponent, onThumbsUp, onThumbsDown, }, }; }, };