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, }, };