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