import type { Meta, StoryObj } from '@storybook/nextjs-vite';
import { useState } from 'react';
import { Badge } from '../components/ui/badge';
import { InfoSection, type InfoSectionRow } from '../components/ui/info-section';
const meta = {
title: 'Tickets/InfoSection',
component: InfoSection,
parameters: {
layout: 'padded',
docs: {
description: {
component:
'A labelled info card: a vertical stack of `label —— value` rows. Each value is configurable — plain text (with an optional trailing image), an inline assignee picker (autocomplete with search), an inline status dropdown, or an arbitrary node.',
},
},
},
tags: ['autodocs'],
decorators: [
Story => (
),
],
} satisfies Meta;
export default meta;
type Story = StoryObj;
const assigneeOptions = [
{ value: 'u1', label: 'Roman Smith' },
{ value: 'u2', label: 'John Doe' },
{ value: 'u3', label: 'Marcus Chen' },
];
const statusOptions = [
{ id: 's1', name: 'AI Handling', color: '#3a3a3a' },
{ id: 's2', name: 'Tech Required', color: '#f59e0b' },
{ id: 's3', name: 'Resolved', color: '#5ea62e' },
];
/**
* The "Ticket Details" card from the design: text, text-with-avatar, an inline
* assignee picker, and an inline status dropdown.
*/
export const TicketDetails: Story = {
args: {
title: 'Ticket Details',
rows: [
{ id: 'customer', label: 'Customer', value: { text: 'Acme Corp', imageFallback: 'Acme Corp' } },
{ id: 'device', label: 'Device', value: { text: 'TB-156-SEA', onClick: () => alert('Navigate to device') } },
{
id: 'assigned',
label: 'Assigned',
value: { type: 'assignee', options: assigneeOptions, onAssign: id => alert(`Assign: ${id}`) },
},
{ id: 'created', label: 'Created', value: { text: '07/12/25, 10:03 AM' } },
{ id: 'created-by', label: 'Created by', value: { text: 'Fae', imageFallback: 'Fae' } },
{
id: 'status',
label: 'Status',
value: { type: 'status', status: 'AI_ASSISTANCE', options: statusOptions, onSelect: id => alert(`Status: ${id}`) },
},
],
},
};
/**
* Live state: assigning a user and changing status update the rows in place.
*/
export const Interactive: Story = {
args: { title: 'Ticket Details', rows: [] },
render: function InteractiveStory() {
const [assignee, setAssignee] = useState(null);
const [statusId, setStatusId] = useState('s1');
const current = assigneeOptions.find(o => o.value === assignee);
const status = statusOptions.find(o => o.id === statusId);
const rows: InfoSectionRow[] = [
{ id: 'customer', label: 'Customer', value: { text: 'Acme Corp', imageFallback: 'Acme Corp' } },
{
id: 'assigned',
label: 'Assigned',
value: {
type: 'assignee',
currentAssignee: current ? { id: current.value, name: current.label } : undefined,
options: assigneeOptions,
onAssign: setAssignee,
},
},
{
id: 'status',
label: 'Status',
value: {
type: 'status',
status: 'AI_ASSISTANCE',
label: status?.name,
color: status?.color,
options: statusOptions,
onSelect: setStatusId,
},
},
{ id: 'priority', label: 'Priority', value: { type: 'custom', content: High } },
];
return ;
},
};