import type { Meta, StoryObj } from '@storybook/nextjs-vite'; import type React from 'react'; import { TicketEventMessage } from '../components/chat/ticket-event-message'; /** * `ticket_event` message segment — the ticket lifecycle receipt (Figma: * `ai-assistant-info`, types resolved-fae / resolved-tech / reopened-fae / * reopened-tech / reopened-reason). * * Decoded from the standalone `TICKET_EVENT` chunk (live) or the persisted * `TicketEventData` row (history). `kind` is an OPEN vocabulary: unknown * kinds render as a neutral info line rather than being dropped, so the * backend can add lifecycle kinds without a client release. */ /** Fixed so the timestamp doesn't churn between snapshots. */ const TIMESTAMP = new Date('2026-08-07T14:47:00'); const plainDecorator = (Story: React.ComponentType) => (
); const meta = { title: 'Chat/Client/TicketEventMessage', component: TicketEventMessage, tags: ['autodocs'], parameters: { docs: { description: { component: "Renders a `TICKET_EVENT` block: a green check for RESOLVED, a pink info tile for REOPENED and for any kind this build doesn't know, with copy composed from the event's actor and reason fields.", }, }, }, decorators: [plainDecorator], } satisfies Meta; export default meta; type Story = StoryObj; /** Fae (the AI agent) resolved the ticket — Figma type=resolved-fae. */ export const ResolvedByFae: Story = { args: { data: { kind: 'RESOLVED', actorId: 'fae', actorName: 'Fae', actorType: 'AI' }, timestamp: TIMESTAMP, }, }; /** A human technician resolved the ticket — Figma type=resolved-tech. */ export const ResolvedByTechnician: Story = { args: { data: { kind: 'RESOLVED', actorId: 'u-42', actorName: 'Roman Smith', actorType: 'TECHNICIAN' }, timestamp: TIMESTAMP, }, }; /** Reopened with the user's stated reason — Figma type=reopened-reason. */ export const ReopenedWithReason: Story = { args: { data: { kind: 'REOPENED', actorId: 'u-7', actorName: 'John Smith', actorType: 'CLIENT', reason: 'The printer stopped working again', }, timestamp: TIMESTAMP, }, }; /** Reopened into AI Handling (targetStatusKind decides) — Figma type=reopened-fae. */ export const ReopenedFaeContinues: Story = { args: { data: { kind: 'REOPENED', actorId: 'u-7', actorName: 'John Smith', actorType: 'CLIENT', targetStatusKind: 'AI_ASSISTANCE', }, timestamp: TIMESTAMP, }, }; /** Reopened into Tech Required (targetStatusKind decides) — Figma type=reopened-tech. */ export const ReopenedTechnicianReplies: Story = { args: { data: { kind: 'REOPENED', actorId: 'u-7', actorName: 'John Smith', actorType: 'CLIENT', targetStatusKind: 'TECH_REQUIRED', }, timestamp: TIMESTAMP, }, }; /** Older backend without targetStatusKind — the actorType heuristic still decides. */ export const ReopenedLegacyActorFallback: Story = { args: { data: { kind: 'REOPENED', actorId: 'fae', actorName: 'Fae', actorType: 'AI' }, timestamp: TIMESTAMP, }, }; /** * A kind the client has never seen. The open vocabulary means the backend can * add lifecycle kinds without a client release — this story is the regression * guard: neutral info line, humanized title, never dropped. */ export const UnknownKind: Story = { args: { data: { kind: 'ON_HOLD', actorName: 'Roman Smith', reason: 'Waiting for replacement hardware' }, timestamp: TIMESTAMP, }, };